Java 使用Jhat堆内置对象

Java 使用Jhat堆内置对象,java,jvm,heap,oql,jhat,Java,Jvm,Heap,Oql,Jhat,有人能举例说明如何在select语句中使用heap.heapForEachClass吗? 如果您可以提供一些带有不同查询示例的链接(当然oqlhelp页面中的示例除外:)我不相信heap.forEachClass()是用于select语句中的,至少不是直接使用的。考虑一个事实:它不返回任何东西: var result=heap.forEachClass(function(it){return it;}); typeof result //returns undefined jhat和Visua

有人能举例说明如何在select语句中使用heap.heapForEachClass吗?
如果您可以提供一些带有不同查询示例的链接(当然oqlhelp页面中的示例除外:)

我不相信heap.forEachClass()是用于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()更复杂:

或者只是

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;

希望这能帮助更多的访问者;)

我在以下网站上找到了一组有趣的例子:
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;