首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Jhat堆内置对象

使用Jhat堆内置对象
EN

Stack Overflow用户
提问于 2011-06-10 19:39:07
回答 2查看 390关注 0票数 1

谁能举例说明如何在select语句中使用heap.heapForEachClass?如果您能提供一些带有不同查询示例的链接(当然不是oqlhelp页面中的链接:),那就太好了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-03 02:36:13

我不认为heap.forEachClass()应该在select语句中使用,至少不是直接使用。考虑到它不返回任何内容的事实:

代码语言:javascript
复制
var result=heap.forEachClass(function(it){return it;});
typeof result
//returns undefined

jhat和VisualVM中使用的OQL确实支持普通的ol‘JavaScript,就像我上面使用的“查询”一样。我相信heap.forEachClass()在JavaScript风格的查询或select类型查询中的JavaScript函数中更有用。

也就是说,我不知道为什么会存在这个函数,因为无论是对于select样式的查询还是对于普通的JavaScript查询,heap.classes()枚举都更容易使用。

您甚至可以使用以下JavaScript函数重新创建与heap.forEachClass()相同的功能:

代码语言:javascript
复制
function heapForEachClass(func){
    map(heap.classes(),func)
    return undefined;
}

我可以为您提供的任何示例查询都可能更容易用heap.classes()编写。例如,您可以使用heap.forEachClass()来获取所有类的列表:

代码语言:javascript
复制
var list=[];
heap.forEachClass(function(it){
    list.push(it);
});
list

但这要比使用heap.classes()复杂得多:

代码语言:javascript
复制
select heap.classes()

或者只是

代码语言:javascript
复制
heap.classes()
票数 2
EN

Stack Overflow用户

发布于 2018-02-21 07:18:45

我以前使用过这个函数来查找被多次加载的类(通常,当两个不同的类加载器加载相同的库时,会无缘无故地占用更多的内存,并使JVM序列化和反序列化从一个类实例传递到另一个类实例的对象,因为它不知道它们实际上是同一个类-because )。

这是我的OQL脚本,它选择(和计数)具有相同名称的类:

代码语言:javascript
复制
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;

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6305832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档