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