Scr*_*ers 5 java heap memory-leaks jhat oql
我正在尝试使用jhat / OQL来跟踪Tomcat容器中的内存泄漏。我想问的问题是:
“向我展示可以从javax.servlet.http.HttpSession访问的foo.bar.Cacheable类的所有实例(和子实例)”
我设法提出了以下内容,但这并未显示foo.bar.Cacheable的子类(这很重要,因为这实际上是一个接口)。
select filter(reachables(s), "/foo.bar.Cacheable/(classof(it).name)") from javax.servlet.http.HttpSession s
Run Code Online (Sandbox Code Playgroud)
我尝试了以下概念的各种排列,但始终会出错(未定义“ foo”)。
select filter(reachables(s), classof(it) instanceof foo.bar.Cacheable) from javax.servlet.http.HttpSession s
Run Code Online (Sandbox Code Playgroud)
谁能通过OQL帮我解决我做错的事情吗?
在基于 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)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3088 次 |
| 最近记录: |