3

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 を使用しています。

4

1 に答える 1

1

System.gc() は、GC を実行する必要があることを JVM に示すだけなので、おそらくそれほど積極的ではありません。その後、GC は、すべての死んだオブジェクト、それらの一部などを収集 (メモリを見つけて解放) する必要があるかどうかを自由に決定できます。以前の優れた収集が最近行われたため、すべてのオブジェクトを再度収集する時期ではないと判断できます。

ヒープをダンプし、生きているオブジェクトのみを明示的に要求すると、オブジェクトがまだ生きている必要がある場合、GC は各オブジェクトを正確に計算するようになると思います。収集作業のこの部分が行われているため、死んだオブジェクトが使用するメモリを解放するのにもそれほどコストはかかりません。

残念ながら、私はこの動作の強力な証拠を持っていません。これは、実際の説明というよりも、荒唐無稽な推測です。

于 2010-11-11T17:21:03.950 に答える