eclipse 用于在堆转储中查询集合的工具

xxb16uws  于 2023-06-22  发布在  Eclipse
关注(0)|答案(1)|浏览(112)

是否可以查询转储在堆转储中的集合?显然,我可以使用Eclipse MAT之类的东西浏览该集合,但我真的很希望能够在集合对象上调用getter。这显然要比在ConcurrentHashMap中遍历片段以找到所需的Map清晰得多。
我想我正在寻找的是某种方法来“再水合”命名集合的转储状态,以便可以使用标准API对其进行操作。
有没有人知道任何这样的实用程序,或者,如果没有,有人可以提供一些示例代码或指针,以如何实现这一点?

iyfjxgzm

iyfjxgzm1#

您应该能够在jhat中使用对象查询语言(OQL)查询所有集合或单个集合。
您不一定调用任意方法,但可以使用可用的函数编写一些复杂的查询。
A.Sundararajan有一些关于这个主题的有趣的博客文章,展示了你能做些什么。参见herehere
例如,您可以使用以下查询查找具有键 testjava.util.HashMap的所有示例:

select s from java.util.HashMap s where contains(s.table, function(it) {
    if (it && it.key && it.key.value && it.key.value.toString() == 'test') {
        return true;
    }
    return false;
})

这应该在java.util.concurrent.ConcurrentHashMap中找到相同的键:

select s from java.util.concurrent.ConcurrentHashMap s where contains(s.segments, function(it) {
    if (!it || !it.table) {
        return false;
    }
    var i, e;
    for (i=0; i < it.table.length; i = i + 1) {
        e = it.table[i];
        if (e) {
            return e.key && e.key.value && e.key.value.toString() == 'test';
        }
    }
    return false;
})

相关问题