Java 对集合<;的堆转储中的引用目标计数;WeakReference>;
我目前正在查看这个愚蠢的小测试类的堆转储(在Java 对集合<;的堆转储中的引用目标计数;WeakReference>;,java,weak-references,eclipse-memory-analyzer,Java,Weak References,Eclipse Memory Analyzer,我目前正在查看这个愚蠢的小测试类的堆转储(在main方法的末尾): 结果: referent | cnt =================== WeakRefTest$RefObj1 | 1000 WeakRefTest$RefObj2 | 1000 经过一些研究,我想我可以构造一个查询,为我提供所涉及的类: select DISTINCT OBJECTS classof(ref.referent) from java.lang.ref.WeakReference ref 唉,这还不包括它
main
方法的末尾):
结果:
referent | cnt
===================
WeakRefTest$RefObj1 | 1000
WeakRefTest$RefObj2 | 1000
经过一些研究,我想我可以构造一个查询,为我提供所涉及的类:
select DISTINCT OBJECTS classof(ref.referent) from java.lang.ref.WeakReference ref
唉,这还不包括它们的计数,OQL似乎不支持GROUPBY
子句。你知道如何获得这些信息吗
编辑以添加:实际上,添加到集
的对象(显然也不是集
实现本身)都不在我的控制之下。很抱歉,不允许修改REBOJ1
和REBOJ2
Edit2:我发现这是关于在jvisualvm中使用OQL的,但事实证明OQL实际上是在堆转储中释放的Javascript。我也很乐意做这样的事。但对我来说,玩弄它还没有产生效果。如果这个问题发生了变化,我将更新它。您可以在对象中编写一个方法,返回信息并从Eclipse调用它
既然您不能修改对象,那么下一个最好的方法就是用某种方法编写一个实用函数,您可以修改它并从eclipse调试器调用它。很抱歉,我对Eclipse了解不够,无法在不向源代码中插入内容的情况下帮助您完成这项工作。我会使用弱哈希集。您只需使用
set.size()
即可获得仍处于活动状态的引用数
static final class RefObj1 { int i; }
static final class RefObj2 { int j; }
public static void main(String[] args) {
Set objects = Collections.newSetFroMap(new WeakHashMap());
RefObj1 obj1 = new RefObj1();
RefObj2 obj2 = new RefObj2();
for (int i = 0; i < 1000; i++) {
objects.add(obj1);
objects.add(obj2);
}
obj1 = null;
System.gc();
System.out.println("Objects left is " + objects.size());
}
静态最终类RefObj1{int i;}
静态最终类REBOJ2{int j;}
公共静态void main(字符串[]args){
Set objects=Collections.newSetFroMap(newweakhashmap());
REBOJ1 obj1=新REBOJ1();
RefObj2 obj2=新RefObj2();
对于(int i=0;i<1000;i++){
对象。添加(obj1);
objects.add(obj2);
}
obj1=null;
gc();
System.out.println(“Objects left is”+Objects.size());
}
我希望根据清理对象的方式打印0、1或2
谢谢你指出这一点,但可悲的是,在我的现实中,这并不是那么简单。我已经更新了问题以反映这一点。@mabi更新了我的答案,但如果这对你没有帮助,那么你需要一位Eclipse专家:)嗯,是的,在我的场景中注入代码很困难(否则我就不需要堆转储;)我显然不擅长问题描述。我只在
main
的末尾生成了一个堆转储,并希望对对象的内容进行反向工程。获取总大小很容易(只需查看HashMap
字段),但我一直在钻研集合的内容。我已经更新了这个问题(希望)让它更清楚。如果你让它说“outgoing”(因为WeakReference.referent
在我的版本中似乎是“outgoing”),我会接受这个问题。
select DISTINCT OBJECTS classof(ref.referent) from java.lang.ref.WeakReference ref
static final class RefObj1 { int i; }
static final class RefObj2 { int j; }
public static void main(String[] args) {
Set objects = Collections.newSetFroMap(new WeakHashMap());
RefObj1 obj1 = new RefObj1();
RefObj2 obj2 = new RefObj2();
for (int i = 0; i < 1000; i++) {
objects.add(obj1);
objects.add(obj2);
}
obj1 = null;
System.gc();
System.out.println("Objects left is " + objects.size());
}