任何人都可以展示如何在 select 语句中使用 heap.heapForEachClass 的示例吗?如果您可以提供一些带有不同查询示例的链接(当然,除了 oqlhelp 页面中的那些 :)),那就太好了
2 回答
我不相信 heap.forEachClass() 是为了在 select 语句中使用,至少不是直接使用。考虑它不返回任何东西的事实:
var result=heap.forEachClass(function(it){return it;});
typeof result
//returns undefined
jhat 和 VisualVM 中使用的 OQL 确实支持普通的 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()
我之前使用过这个函数来查找多次加载的类(通常,当两个不同的类加载器加载同一个库无缘无故占用更多内存并使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;
希望这将有助于更多的访客;)