在基于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)
}
}