OQL-запрос для поиска всех экземпляров и подэкземпляров данного класса, на которые ссылается сеанс - PullRequest
5 голосов
/ 22 апреля 2010

Я пытаюсь использовать jhat / OQL для отслеживания утечки памяти в нашем контейнере Tomcat. Вопрос, который я хочу задать:

"Показать мне все экземпляры (и вложенные экземпляры) класса foo.bar.Cacheable, которые доступны из javax.servlet.http.HttpSession"

Мне удалось придумать следующее, но это не показывает подклассы foo.bar.Cacheable (что важно, так как это влияет на интерфейс).

select filter(reachables(s), "/foo.bar.Cacheable/(classof(it).name)") from javax.servlet.http.HttpSession s

Я пробовал различные варианты концепции, приведенной ниже, но просто продолжаю получать ошибки ("foo" не определено).

select filter(reachables(s), classof(it) instanceof foo.bar.Cacheable) from javax.servlet.http.HttpSession s

Может кто-нибудь помочь мне с тем, что я делаю неправильно, чтобы задать этот вопрос через OQL?

1 Ответ

4 голосов
/ 17 февраля 2011

В реализациях OQL на основе jhat (jHat, VisualVM) вы можете использовать тот факт, что вы не ограничены синтаксисом, подобным SQL, но у вас есть полный движок javascript.

Следующий фрагмент кода сделает свое дело

var containerSuperClass = "javax.servlet.http.HttpSession"
var elementSuperClass = "foo.bar.Cacheable"
// find the container class by name
var alClz = heap.findClass(elementSuperClass)
// retrieve all subclasses
var subClzs = alClz.subclasses()

// filter the list of objects reachables from instances of the container super class
// and all its subclasses so it contains only objects of classes from subClzs
map(heap.objects(containerSuperClass), 'filter(reachables(it), "it != null && contains(subClzs, containsClause(it))")')

// we need to externalize the contains clause because of clash in naming the closure parameter 'it'
function containsClause(rcbl) {
    return function(it) {
        if (rcbl == null || it == null) return false;
        return it.name.equals(classof(rcbl).name)
    }
}
...