有人能举例说明如何在select语句中使用heap.heapForEachClass吗?如果您能提供一些带有不同查询示例的链接(当然不是oqlhelp页面中的链接:)
我不认为heap.forEachClass()应该用在select语句中,至少不能直接用。考虑一下它不返回任何东西的事实:
var result=heap.forEachClass(function(it){return it;});
typeof result
//returns undefined
jhat和VisualVM中使用的OQL确实支持普通的o'JavaScript,就像我上面使用的"查询"一样。我相信heap.forEachClass()在JavaScript风格的查询或选择类型查询中的JavaScript函数中有更多的用途。
也就是说,我不知道为什么会有这个函数,因为heap.classes()枚举更容易使用,无论是与select风格的查询还是纯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()
我以前使用过这个函数来查找多次加载的类(通常,当两个不同的类加载程序加载同一个lib时,会发生这种情况,它们会无故占用更多内存,并使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;
希望这将帮助更多的游客;)