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

  • 打开直方图视图(有一个工具栏按钮,看起来像条形图)
  • 在直方图视图的第一行(显示“Regex”)中,键入WeakReference以过滤视图
  • 找到java.lang.ref.WeakReference行,右键单击,然后选择“按类显示对象”->“按传出引用”
  • 生成的视图应汇总所引用的对象,并根据需要按类分组。“对象”列应指明每个类的实例数

  • 谢谢你指出这一点,但可悲的是,在我的现实中,这并不是那么简单。我已经更新了问题以反映这一点。@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());
    }