これらは, ParallelScavengeHeap の MarkSweep 処理 (UseParallelOldGC オプションが指定されていない場合の Major GC 処理)で使用される補助クラス(See: here for details).
ParallelScavengeHeap 用の MarkSweep クラス (つまり, Mark Sweep Compact 処理で使用される補助関数や Closure クラス等を納めた名前空間(AllStatic クラス) (See: MarkSweep)).
シングルスレッドでの Mark-Sweep-Compact 処理を実装している.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.hpp))
class PSMarkSweep : public MarkSweep {
UseParallelOldGC オプションが指定されていない場合, Major GC 処理はこのクラスの PSMarkSweep::invoke() メソッドが呼び出されることで実行される (See: here for details).
なお UseParallelOldGC オプションが指定されている場合は, このクラスの代わりに PSParallelCompact クラスが使用される (See: PSParallelCompact).
内部には, Mark-Sweep-Compact 処理のための以下のようなメソッドが定義されている.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.hpp))
static void invoke(bool clear_all_softrefs);
static void invoke_no_policy(bool clear_all_softrefs);
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.hpp))
// Mark live objects
static void mark_sweep_phase1(bool clear_all_softrefs);
// Calculate new addresses
static void mark_sweep_phase2();
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.hpp))
// Update pointers
static void mark_sweep_phase3();
// Move objects to new positions
static void mark_sweep_phase4();
ただし, 処理の肝心な部分は PSMarkSweepDecorator クラスに実装されており, PSMarkSweep はそちらに丸投げしているだけだったりする (See: PSMarkSweepDecorator).
See: here for details
PSMarkSweep::mark_sweep_phase3() 内で使用される補助クラス.
PSMarkSweep 用の AlwaysTrueClosure クラス (つまり, JNI の Weak Global Handle を辿る処理で使用される Closure. 名前の通り, どんな場合でも常に true を返す. (See: AlwaysTrueClosure))
(なおコメントによると, このクラスは ParallelScavenge 用のソースファイルではなく全 MarkSweep 共通の部分で定義されるべき, とのこと)
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp))
// This should be moved to the shared markSweep code!
class PSAlwaysTrueClosure: public BoolObjectClosure {
always_true という大域変数に(のみ)格納されている.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp))
static PSAlwaysTrueClosure always_true;
PSMarkSweep::mark_sweep_phase3() 内で(のみ)使用されている.
(なお, phase1 の中で ReferenceProcessor::process_discovered_references() が呼び出された段階で, 死んでいる Weak Global Reference については NULL になっている. このため, PSAlwaysTrueClosure のような常に true を返すだけの Closure でも, 生きている Weak Global Reference だけを全て辿ることができる.)
名前の通り, do_object_b() は常に true を返す.
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp))
void do_object(oop p) { ShouldNotReachHere(); }
bool do_object_b(oop p) { return true; }
このクラスは PSMarkSweep 用だが, PSParallelCompact 用にも全く同じクラスが存在している (See: PSAlwaysTrueClosure).
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.