1

NetbBeans で Java GC サイクル中にオブジェクトがクリアされていることを確認するにはどうすればよいですか? また、アプリケーションを実行しているときに GC がいつトリガーされるかを知る方法はありますか?

あなたの応答と時間に感謝します。

4

3 に答える 3

2

オブジェクトをファイナライズ可能にすることで、オブジェクトを追跡できます。一般的にこれは悪い考えですが、これが最も簡単な方法です。

JMX の MemoryManagerMXBean を調べることで、GC が発生したことを検出できます。

NotificationFilter filter = new NotificationFilter() {
    @Override
    public boolean isNotificationEnabled(Notification notification) {
        return true;
    }
};
NotificationListener listener = new
        NotificationListener() {
            @Override
            public void handleNotification(Notification notification, Object handback) {
                System.out.println(notification);
            }
        };
for (MemoryManagerMXBean memoryManagerMXBean : ManagementFactory.getMemoryManagerMXBeans()) {
    if (memoryManagerMXBean instanceof NotificationBroadcaster)
        ((NotificationBroadcaster) memoryManagerMXBean).addNotificationListener(listener, filter, memoryManagerMXBean);
}
System.gc();
Thread.sleep(500);

版画

javax.management.Notification[source=java.lang:type=GarbageCollector,name=PS Scavenge][type=com.sun.management.gc.notification][message=PS Scavenge]
javax.management.Notification[source=java.lang:type=GarbageCollector,name=PS MarkSweep][type=com.sun.management.gc.notification][message=PS MarkSweep]

明らかに、本当に正当な理由がなく、コードが複雑になり、JVM のオーバーヘッドが増えるため、非常に便利である場合を除き、これらのことはどちらも実行しません。

于 2013-11-03T20:58:50.140 に答える
1

PhantomReferenceを使用できます。これは、ファイナライズによるパフォーマンスの低下なしに、再利用の対象となるオブジェクトを追跡する方法です。また、ファントム到達可能オブジェクトを誤って有効に戻すことはできません。

次のようなコードを使用して、目標を達成できます。

public class GCTracker extends PhantomReference {
  private Object id;
  public GCTracker(Object object, ReferenceQueue referenceQueue, Object id) {
    super(object, referenceQueue);
    this.id = id;
  }
  public Object getId() {
    return id;
  }
}
ReferenceQueue<GCTracker> q = new ReferenceQueue<>();
Object id = "id1";
// never use the same object for the referent and the id
GCTracker pr = new GCTracker(object, referenceQueue, id);
// Later on another point
GCTracker r = q.remove();

// Use r.getId() to track the object being reclaimed
于 2013-11-03T21:19:48.633 に答える