使用Jhat堆内置对象

时间:2011-06-10 11:39:07

标签: java jvm heap oql jhat

有人能举例说明如何在select语句中使用heap.heapForEachClass吗? 如果您能提供一些不同查询示例的链接(当然不是oqlhelp页面中的那些),那将是很棒的。)

2 个答案:

答案 0 :(得分:2)

我不相信heap.forEachClass()意味着在select语句中使用,至少不是直接使用。考虑一下它不会返回任何内容的事实:

var result=heap.forEachClass(function(it){return it;});
typeof result
//returns undefined

jhat和VisualVM中使用的OQL支持普通的JavaScript,就像我上面使用的“查询”一样。我相信heap.forEachClass()可以在JavaScript样式的查询中或在select-type查询中的JavaScript函数中找到更多用途。

也就是说,我不知道为什么这个函数存在,因为heap.classes()枚举更容易使用,包括select-style查询和纯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()

答案 1 :(得分:1)

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

希望这有助于进一步的访客;)