是否可以查询在堆转储中转储的集合?我显然可以使用Eclipse MAT之类的东西浏览该集合,但是真的很想能够在集合对象上实际调用getter.在ConcurrentHashMap尝试找到我需要的映射时,这显然比通过段更清晰.
我想我正在寻找的是某种方法来"重新水化"命名集合的转储状态,以便可以使用标准API对其进行操作.
有没有人知道任何这样的实用程序,或者,如果没有,有人可以提供一些示例代码或指示如何实现这一点?
您应该能够在jhat中使用对象查询语言(OQL)查询所有集合或单个集合.
您不一定能调用任意方法,但可以使用可用函数编写一些复杂的查询.
A. Sundararajan有一些关于这个主题的有趣博客文章,展示了你可以做些什么.看到这里和这里.
例如,您可以使用以下查询找到java.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;
})
Run Code Online (Sandbox Code Playgroud)
这应该在以下内容中找到相同的密钥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;
})
Run Code Online (Sandbox Code Playgroud)