JVM がガベージ コレクションに労力を費やすことを示唆するには、直接的または間接的に少なくとも 2 つの方法があります。
System.gc()
- ヒープ ダンプを取り、ライブ オブジェクトのみを要求する
後者では、プログラムでヒープ ダンプを取得できます。
hotspotMBean = ManagementFactory.newPlatformMXBeanProxy(ManagementFactory.getPlatformMBeanServer(), "com.sun.management:type=HotSpotDiagnostic", HotSpotDiagnosticMXBean.class);
hotspotMBean.dumpHeap(filename, live);
強く到達できないオブジェクトを収集するためにこれら 2 つの操作が行うことの間に、あるとすればどのような違いがありますか?
System.gc()
ヒープ ダンプ アプローチは、弱い参照、RMI 分散ガベージ コレクション、およびスタックから強力に到達可能な非表示オブジェクトの組み合わせが存在する場合よりも攻撃的であるという証拠があると思います。特に、ローカルでのアクセスが弱くUnreferenced
、RMI に関しては、ヒープ ダンプによってのみ収集されるようになったオブジェクトが表示されます。これを小さなテストケースに分解することはまだできていませんが、再現可能です。
(製品コードの特定の GC 動作に依存しないように警告される前に、私はそうではありません。メモリ リークの可能性を調査しているときにこれを発見し、いつヒープ ダンプを取得したかによって結果が異なることに気付きました。奇妙な。)
これは、Windows 7 で HotSpot 64-Bit Server VM 1.6.0_22 を使用しています。