Java GC - 有一种方法可以确定收集哪些对象

Sef*_*ffi 7 java garbage-collection

我正在尝试使用-verbosegc标志来监控应用中的gc活动.我可以看到有完整和次要的集合,但有没有办法确定(确定事件/ vm标志/其他什么)实际收集的对象?

谢谢!

M. *_*sup 5

有关内存中对象的一般信息,我建议您查看jvisualvm(它位于JDK的bin文件夹中).它有很多关于VM在程序运行时正在做什么的有用信息,包括有关各种对象和内存状态的信息.

如果您想要更具体的东西,可以使用WeakReferences和ReferenceQueues.如果您只对几种类型的对象感兴趣,则此选项可能是可行的.您可以使用公共ReferenceQueue创建对象的WeakReference,然后让另一个线程定期检查Queue(请注意,队列只表示对象可以访问,而不是实际收集它们):

static ReferenceQueue<MyObject> MY_QUEUE = new ReferenceQueue<MyObject>();
static class MyReference extends WeakReference<MyObject>{
  public final String name;
  public MyReference(MyObject o, ReferenceQueue<MyObject> q){
    super(o, q);
    name = o.toString();
  }
}

static{
  Thread t = new Thread(){
    public void run(){
      while(true){
        MyReference r = (MyReference)MY_QUEUE.remove();
        System.out.println(r.name+" eligible for collection");
      }
    }
  }
  t.setDaemon(true);
  t.start();
}

public MyObject(){
  //normal init...
  new MyReference(this, MY_QUEUE);
}
Run Code Online (Sandbox Code Playgroud)