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

Я пытаюсь использовать 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 ответ

Решение

В основанных на jhat реализациях OQL (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)
    }
}
Другие вопросы по тегам