有没有人能举一个例子来说明如何在select语句中使用heap.heapForEachClass?如果你能提供一些链接,并提供不同的查询示例,那就太好了(当然,除了oqlhelp页面中的那些:))
zqry0prt1#
我不认为heap.forEachClass()应该用在select语句中,至少不能直接用在select语句中。
var result=heap.forEachClass(function(it){return it;}); typeof result //returns undefined
jhat和VisualVM中使用的OQL确实支持普通的Ol' JavaScript,就像我上面使用的“查询”一样。我相信heap.forEachClass()在JavaScript样式的查询或选择类型查询中的JavaScript函数中更有用。也就是说,我不知道为什么存在这个函数,因为heap.classes()枚举更容易使用,无论是选择样式的查询还是普通的JavaScript查询。您甚至可以使用以下JavaScript函数重新创建与heap.forEachClass()相同的功能:
function heapForEachClass(func){ map(heap.classes(),func) return undefined; }
我提供给你的任何示例查询都可能更容易用heap.classes()来编写。例如,你可以使用heap.forEachClass()来获取所有类的列表:
var list=[]; heap.forEachClass(function(it){ list.push(it); }); list
但这比使用heap.classes()的方式要复杂得多:
select heap.classes()
或仅
heap.classes()
luaexgnf2#
我以前使用过这个函数来查找被多次加载的类(通常,当两个不同的类加载器加载同一个库时,会无缘无故占用更多的内存,并使JVM序列化和反序列化从一个类示例传递到另一个类示例的对象--因为它不知道它们实际上是同一个类--)这是我的OQL脚本,它选择(并计算)具有相同名称的类:
var classes = {}; var multipleLoadedClasses = {}; heap.forEachClass(function(it) { if (classes[it.name] != null) { if (multipleLoadedClasses[it.name] != null) { multipleLoadedClasses[it.name] = multipleLoadedClasses[it.name] + 1; } else { multipleLoadedClasses[it.name] = 1; } } else { classes[it.name] = it; } }); multipleLoadedClasses;
希望这将有助于更多的游客;)
2条答案
按热度按时间zqry0prt1#
我不认为heap.forEachClass()应该用在select语句中,至少不能直接用在select语句中。
jhat和VisualVM中使用的OQL确实支持普通的Ol' JavaScript,就像我上面使用的“查询”一样。我相信heap.forEachClass()在JavaScript样式的查询或选择类型查询中的JavaScript函数中更有用。
也就是说,我不知道为什么存在这个函数,因为heap.classes()枚举更容易使用,无论是选择样式的查询还是普通的JavaScript查询。
您甚至可以使用以下JavaScript函数重新创建与heap.forEachClass()相同的功能:
我提供给你的任何示例查询都可能更容易用heap.classes()来编写。例如,你可以使用heap.forEachClass()来获取所有类的列表:
但这比使用heap.classes()的方式要复杂得多:
或仅
luaexgnf2#
我以前使用过这个函数来查找被多次加载的类(通常,当两个不同的类加载器加载同一个库时,会无缘无故占用更多的内存,并使JVM序列化和反序列化从一个类示例传递到另一个类示例的对象--因为它不知道它们实际上是同一个类--)
这是我的OQL脚本,它选择(并计算)具有相同名称的类:
希望这将有助于更多的游客;)