我目前正在查看这个愚蠢的小测试类的堆转储(在main
方法的最后获取):
public class WeakRefTest {
static final class RefObj1 { int i; }
static final class RefObj2 { int j; }
public static void main(String[] args) {
Set<WeakReference<?>> objects = new HashSet<>();
RefObj1 obj1 = new RefObj1();
RefObj2 obj2 = new RefObj2();
for (int i = 0; i < 1000; i++) {
objects.add(new WeakReference<RefObj1>(obj1));
objects.add(new WeakReference<RefObj2>(obj2));
}
}
}
现在我试图弄清楚如何计算对特定类的引用数objects
。如果这是一个 SQL 数据库,那就很简单了:
select objects.className as referent, count(*) as cnt
from java.lang.ref.WeakReference ref
inner join heapObjects objects on ref.referent = objects.objectId
group by objects.className;
结果:
referent | cnt
===================
WeakRefTest$RefObj1 | 1000
WeakRefTest$RefObj2 | 1000
经过一番研究,我想我可以构建一个Eclipse MAT OQL查询,它为我提供了所涉及的类:
select DISTINCT OBJECTS classof(ref.referent) from java.lang.ref.WeakReference ref
唉,这不包括他们的计数,OQL 似乎不支持GROUP BY
子句。任何想法如何获取此信息?
编辑添加:实际上,添加到的对象Set
(显然也不是Set
实现本身)都不受我的控制。很抱歉,修改RefObj1
和RefObj2
不允许。
Edit2:我发现了这个关于在 jvisualvm 中使用 OQL 的相关问题,但事实证明OQL实际上是在堆转储中释放的 Javascript。我也会接受这样的事情。但是玩弄它并没有对我产生结果。如果情况发生变化,我会更新问题。