1

任何人都可以展示如何在 select 语句中使用 heap.heapForEachClass 的示例吗?如果您可以提供一些带有不同查询示例的链接(当然,除了 oqlhelp 页面中的那些 :)),那就太好了

4

2 回答 2

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()
于 2012-02-02T18:36:13.003 回答
1

我之前使用过这个函数来查找多次加载的类(通常,当两个不同的类加载器加载同一个库无缘无故占用更多内存并使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;

希望这将有助于更多的访客;)

于 2018-02-20T23:18:44.977 回答