[Java] Eager reclamation of Humongous objects with G1

原文はこちら。
https://blogs.oracle.com/poonam/entry/eager_reclamation_of_humongous_objects

JDK 8u40 と8u60 のG1GCで、すばらしい機能拡張がなされました。これらのリリースにアップグレードされた際に驚かれたかもしれません。

領域の半分以上を占めるオブジェクトはHumongousオブジェクトと呼ばれ、Humongoud領域と呼ばれる特殊な領域に格納されることはご存知の通りです。8u40以前は、Humongous領域はEvacuation Pauseで回収されず、マーキングサイクルの最後、もしくはFull GC時にのみ回収されていました。

8u40で、G1GCに対し以下の機能強化が図られました。
JDK-8027959: Early reclamation of large objects in G1
https://bugs.openjdk.java.net/browse/JDK-8027959
この機能強化により、どこからも参照されないHumongousオブジェクトの再利用が可能になりました。以下の2個の実験的なJVMオプションが追加されました。
  • G1ReclaimDeadHumongousObjectsAtYoungGC
    実験的なオプションで、デフォルトで有効。このオプションが有効である場合、G1はyoung GCの都度Dead状態の(死んだ)オブジェクトを再利用する。
  • G1TraceReclaimDeadHumongousObjectsAtYoungGC
    実験的なオプションでデフォルトでは無効。このオプションが有効である場合、G1はyoung GCの際にHumongousオブジェクトのGCに関する情報を出力する。
ただ、上記変更はリグレッションがありました。これは8u60で修正されています。
JDK-8069367: Eagerly reclaimed humongous objects left on mark stack
https://bugs.openjdk.java.net/browse/JDK-8069367
8u60でこの機能拡張が改善され、参照されるオブジェクトを持つ可能性のあるHumongous領域も早期再利用の対象になっています。これらの参照される参照を検査し、これらの参照がストール/死んでいるとG1が認知した場合には、Humongous領域は再利用されます。この作業は、以下の機能拡張リクエストの一環で行われました。
JDK-8048179: Early reclaim of large objects that are referenced by a few objects
https://bugs.openjdk.java.net/browse/JDK-8048179
この変更に伴い、JVMオプションの名称変更がありました。
G1ReclaimDeadHumongousObjectsAtYoungGCG1EagerReclaimHumongousObjects
G1TraceReclaimDeadHumongousObjectsAtYoungGC G1TraceEagerReclaimHumongousObjects

さらに、新しいJVMオプション(G1EagerReclaimHumongousObjectsWithStaleRefs)が追加されています。
  • G1EagerReclaimHumongousObjectsWithStaleRefs
    実験的なオプションで、デフォルトで有効。このオプションが有効である場合、G1は参照されるオブジェクトを有する可能性のあるHumongousオブジェクトを、young GCの都度再利用しようとする。

0 件のコメント:

コメントを投稿