ParallelScavengeHeap の MarkSweep 処理 (UseParallelOldGC オプションが指定されていない場合の Major GC 処理)で使用される補助クラス(See: here for details).
MutableSpace 上での (シングルスレッドでの) Mark-Sweep-Compact 処理を実装したクラス (MarkSweep 処理のエントリポイント自体は PSMarkSweep クラスだが, 処理の肝心な部分を担当しているのは PSMarkSweepDecorator クラス)
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.hpp))
//
// A PSMarkSweepDecorator is used to add "ParallelScavenge" style mark sweep operations
// to a MutableSpace.
//
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.hpp))
class PSMarkSweepDecorator: public CHeapObj {
MutableSpace オブジェクトを保持しているクラス内に一緒に保持されている.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.hpp))
class PSYoungGen : public CHeapObj {
...
// Spaces
MutableSpace* _eden_space;
MutableSpace* _from_space;
MutableSpace* _to_space;
...
// MarkSweep Decorators
PSMarkSweepDecorator* _eden_mark_sweep;
PSMarkSweepDecorator* _from_mark_sweep;
PSMarkSweepDecorator* _to_mark_sweep;
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psOldGen.hpp))
class PSOldGen : public CHeapObj {
...
MutableSpace* _object_space; // Where all the objects live
PSMarkSweepDecorator* _object_mark_sweep; // The mark sweep view of _object_space
実際の Mark-Sweep-Compact 処理を行う以下の3つのメソッドを備えている.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.hpp))
// Work methods
void adjust_pointers();
void precompact();
void compact(bool mangle_free_space);
なお, PSMarkSweepDecorator クラスは PSMarkSweepDecorator 型の _destination_decorator という static フィールドに持っている.
これは, コンパクション先の領域を示すもの.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.hpp))
static PSMarkSweepDecorator* _destination_decorator;
(以下のようなアクセサメソッドも用意されている)
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.hpp))
// During a compacting collection, we need to collapse objects into
// spaces in a given order. We want to fill space A, space B, and so
// on. The code that controls that order is in the following methods.
static void set_destination_decorator_tenured();
static void set_destination_decorator_perm_gen();
static void advance_destination_decorator();
static PSMarkSweepDecorator* destination_decorator();
具体的な使い方としては, コンパクション処理を開始する前にここにコンパクション先の領域を設定しておき, 処理中ではこのフィールドを参照してコンパクション先のアドレスを決定する, という感じになる.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp))
// Begin compacting into the old gen
PSMarkSweepDecorator::set_destination_decorator_tenured();
// This will also compact the young gen spaces.
old_gen->precompact();
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.