これらは, G1CollectedHeap 使用時における Garbage Collection 処理用の補助クラス. より具体的に言うと, Java プログラムの実行と並行(concurrent)に Marking 処理を行うクラス (See: here for details).
Concurrent Marking 処理を取りまとめるクラス. 以下のような役割を果たしている.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp))
class ConcurrentMark: public CHeapObj {
各 G1CollectedHeap オブジェクトの _cm フィールドに(のみ)格納されている.
G1CollectedHeap::initialize() 内で(のみ)生成されている.
See: here for details
Concurrent Marking の処理結果 (= どのオブジェクトが生きているかという情報) を記録するためのクラスの基底クラス (論文中では "marking bitmaps").
内部的には (名前の通り) ビットマップになっており, 生きているオブジェクトに対応するビットが立てられる.
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp))
// A generic CM bit map. This is essentially a wrapper around the BitMap
// class, with one bit per (1<<_shifter) HeapWords.
class CMBitMapRO VALUE_OBJ_CLASS_SPEC {
実際の情報は _bm フィールドの BitMap オブジェクトに格納される.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp))
BitMap _bm; // the bit map itself
なお, このビットマップ上の 1bit は, 実際のヒープ空間上での "(1<<_shifter) HeapWords" に対応する. _shifter フィールドの値はコンストラクタ引数によって決まるが, このクラス自体は abstract class なので, サブクラスである CMBitMap の生成箇所も参照.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp))
const int _shifter; // map to char or bit
See: here for details
名称の "RO" は "Read Only" の意味だと思われる. このクラスはビットマップを変更するメソッドを持たない (そういったメソッドはサブクラスの CMBitMap が持っている).
(このクラスは「immutable な」CMBitMap だとソースコード上で明示する役割があるのだと思われる. ソースコード上でも, サブクラスの CMBitMap オブジェクトとして生成されたものがビットマップデータが完成した後は CMBitMapRO として使われていたりする)
See: here for details
ConcurrentMark クラス内で使用される補助クラス.
CMBitMapRO クラスの具象サブクラス. このオブジェクト内に実際の Concurrent Marking 処理結果が格納される.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp))
class CMBitMap : public CMBitMapRO {
以下の箇所に(のみ)格納されている.
どちらのフィールドのオブジェクトも, コンストラクタ引数として指定されている _shifter の値 (See: CMBitMapRO) は MinObjAlignment.
See: here for details
See: here for details
ConcurrentMark クラス内で使用される補助クラス. Gray なオブジェクト (= Concurrent Marking 処理で発見したが, まだ中までは調査できていないオブジェクト) を入れておくスタック (論文中では "mark stack").
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp))
// Represents a marking stack used by the CM collector.
// Ideally this should be GrowableArray<> just like MSC's marking stack(s).
class CMMarkStack VALUE_OBJ_CLASS_SPEC {
各 ConcurrentMark オブジェクトの _markStack フィールドに(のみ)格納されている.
(ConcurrentMark クラスの _markStack フィールドは, ポインタ型ではなく実体なので, ConcurrentMark オブジェクトの生成時に一緒に生成される)
以下の箇所で使用されている (<= 他にも oops_do() 等の中で参照されている #TODO).
* ConcurrentMark オブジェクトの生成時に初期化される. ConcurrentMark::ConcurrentMark() -> ConcurrentMark::set_non_marking_state() -> ConcurrentMark::clear_marking_state() * Concurrent Marking 処理中に, 見つかったオブジェクトがスタックに追加される ConcurrentMark::mark_stack_push(oop p) -> CMMarkStack::par_push() * Concurrent Marking 処理中に, 見つかった配列オブジェクトがスタックに追加される ConcurrentMark::mark_stack_push(oop* arr, int n) -> CMMarkStack::par_push_arr() * Concurrent Marking 処理中に, スタックに積まれた要素が取り出されて処理される CMTask::drain_global_stack() -> CMTask::get_entries_from_global_stack() -> ConcurrentMark::mark_stack_pop() -> CMMarkStack::par_pop_arr() * Concurrent Marking 処理中に見つかった参照オブジェクトについても, 生きているものは参照先がスタックに積まれるので, それらがスタックから取り出されて辿れる範囲全てが処理される ConcurrentMark::weakRefsWork() -> ReferenceProcessor::process_discovered_references() -> ... -> G1CMDrainMarkingStackClosure::do_void() -> CMMarkStack::drain() * Concurrent Marking が終了した時点で, 初期状態にリセットされる ConcurrentMark::checkpointRootsFinal -> ConcurrentMark::set_non_marking_state() -> ConcurrentMark::clear_marking_state()
See: here for details
Concurrent Marking 処理用の補助クラス.
Concurrent Marking 処理中に発生した Minor GC でコピー先として使用されたメモリ領域を記録しておくためのクラス (Concurrent Mark 処理中に Minor GC が行われた場合, コピー処理によってポインタが移動されることになるので, コピーされたオブジェクトについては再度調査しないといけない. このため, どこにコピーされたかを記録しておく必要がある).
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp))
class CMRegionStack VALUE_OBJ_CLASS_SPEC {
各 ConcurrentMark オブジェクトの _regionStack フィールドに(のみ)格納されている.
(ConcurrentMark クラスの _regionStack フィールドは, ポインタ型ではなく実体なので, ConcurrentMark オブジェクトの生成時に一緒に生成される)
以下の箇所で(のみ)使用されている.
* Minor GC 中にコピー先の HeapRegion が一杯になった時点で, そのコピー先がスタックに追加される G1ParCopyHelper::copy_to_survivor_space() -> G1ParScanThreadState::allocate() -> G1ParScanThreadState::allocate_slow() -> G1ParGCAllocBuffer::retire() -> GCLabBitMap::retire() -> ConcurrentMark::grayRegionIfNecessary() -> ConcurrentMark::region_stack_push_lock_free() * Minor GC で終わった時点で, 最後にコピー先として使用していた HeapRegion がスタックに追加される. G1ParEvacuateFollowersClosure::do_void() -> G1ParScanThreadState::retire_alloc_buffers() -> G1ParGCAllocBuffer::retire() -> (同上) * Concurrent Marking 処理中に, スタックから要素が取り出され, その中のポインタが再調査される. CMTask::do_marking_step() -> CMTask::drain_region_stack() -> ConcurrentMark::region_stack_pop_lock_free()
なお, ConcurrentMark::_regionStack フィールドは以下の箇所でも参照されているが, これらの関数は使用箇所が見当たらない...
See: here for details
デバッグ用(開発時用)のクラス (#ifdef ASSERT 時以外には空のクラスとして定義される).
強制的に ConcurrentMark 内のスタックが溢れた状態にするためのクラス (スタックが溢れたとは, ConcurrentMark::has_overflown() が true を返す状態).
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp))
class ForceOverflowSettings VALUE_OBJ_CLASS_SPEC {
ForceOverflowSettings::init() で初期化する
ForceOverflowSettings::should_force() を呼び出すと true が返される. 一度呼び出すと次からは false が返されるが, ForceOverflowSettings::update() を呼ぶとまた true を返す状態に戻すことが出来る. ただし, G1ConcMarkForceOverflow 回だけ ForceOverflowSettings::update() を呼んだ後は, もう true の状態に戻すことは出来ない(= それ以降は false しか返されない).
(なお, G1ConcMarkForceOverflow オプションの値が 0 の場合は, 1回目の ForceOverflowSettings::should_force() から false を返す. G1ConcMarkForceOverflow オプションのデフォルト値は 0.)
以下の箇所に(のみ)格納されている.
See: here for details
ConcurrentMark クラス内で使用される補助クラス. 実際のマーク処理を行う.
また Concurrent Marking 処理用の TerminatorTerminator クラスとしての役割もある (マーク処理が完了したかどうかに応じて should_exit_termination() メソッドの返値が変わる (See: TerminatorTerminator)).
なお, CMTask オブジェクトは各 ConcurrentMarkThread に対して 1つ用意される.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp))
// A class representing a marking task.
class CMTask : public TerminatorTerminator {
CMTask::do_marking_step() を呼ぶと, (SATBMarkQueueSet や CMMarkStack, CMRegionStack に入っているポインタを対象として) マーキング処理が行われる (See: here for details).
マーキング処理が全て終わったかどうかは CMTask::has_aborted() で確認できる.
各 ConcurrentMark オブジェクトの _tasks フィールドに(のみ)格納されている (正確には, このフィールドは CMTask の配列を格納するフィールド. この中に, 使用される全ての CMTask オブジェクトが格納されている).
ConcurrentMark::ConcurrentMark() 内で(のみ)生成されている. 配列用のメモリ空間の確保もここで行う.
ConcurrentMark::~ConcurrentMark() 内で(のみ)削除されている.
See: here for details
G1CollectedHeap 使用時の Garbage Collection 処理で使用される補助クラス.
参照オブジェクト(java.lang.ref オブジェクト)の処理に用いられる Closure クラス. G1CMIsAliveClosure::do_object_b() メソッドが呼ばれると, (Concurrent Marking による mark 結果に基づいて)処理対象のオブジェクトが生きているかどうかを返す.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp))
// Closure used by CM during concurrent reference discovery
// and reference processing (during remarking) to determine
// if a particular object is alive. It is primarily used
// to determine if referents of discovered reference objects
// are alive. An instance is also embedded into the
// reference processor as the _is_alive_non_header field
class G1CMIsAliveClosure: public BoolObjectClosure {
(このクラスは StackObj クラスだが, (原則に反して) 永続的に存在し続けるインスタンスが存在する).
各 G1CollectedHeap オブジェクトの _is_alive_closure フィールドに(のみ)格納されている.
以下の箇所で(のみ)使用されている.
(G1CollectedHeap::_is_alive_closure フィールドは, 同じく G1CollectedHeap の _ref_processor フィールドに格納されている ReferenceProcessor のコンストラクタ引数として(のみ)使用されている.
そしてその ReferenceProcessor オブジェクト内では ReferenceProcessor::discover_reference() で(のみ)使用されている.
なお, この ReferenceProcessor オブジェクトは G1CollectedHeap の GC 処理 (Concurrent Marking 処理も含む) 中で参照オブジェクトの処理に使用されている) (See: here for details)
(See: here for details)
(See: here for details)
See: here for details
トラブルシューティング用のクラス (関連する product オプションが指定されている場合にのみ使用される) (See: G1PrintRegionLivenessInfo).
処理対象の HeapRegion の情報を指定された outputStream に出力する (例えば, その HeapRegion 内の live オブジェクトの量, 等).
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.hpp))
// Class that's used to to print out per-region liveness
// information. It's currently used at the end of marking and also
// after we sort the old regions at the end of the cleanup operation.
class G1PrintRegionLivenessInfoClosure: public HeapRegionClosure {
以下の箇所で(のみ)使用されている.
See: here for details
G1CollectedHeap の Minor GC 処理("Evacuation Pause" 処理)で使用される Closure クラス (See: here for details).
Concurrent Marking 処理を補佐するためのクラス. その Minor GC 後に Concurrent Marking 処理を開始させる場合に, 各 HeapRegion の現在の top 位置を next TAMS に記録する.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class NoteStartOfMarkHRClosure: public HeapRegionClosure {
ConcurrentMark::checkpointRootsInitialPost() 内で(のみ)使用されている.
See: here for details
G1GC の ConcurrentMarkThread (の Initial Marking Pause 処理) で使用される補助クラス(StackObjクラス) (See: here for details).
処理対象のオブジェクトにまだマークが付いていなければマークする (= CMBitMap の該当箇所が立っていなければ, そのビットを立てる).
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class CMMarkRootsClosure: public OopsInGenClosure {
ConcurrentMark::checkpointRootsInitial() 内で(のみ)使用されている.
See: here for details
G1GC の ConcurrentMarkThread (の Concurrent Marking 処理) で使用される補助クラス(StackObjクラス) (See: here for details).
(SATBMarkQueueSet や CMMarkStack, CMRegionStack に入っているポインタに対して) マーキング処理を行う.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class CMConcurrentMarkingTask: public AbstractGangTask {
ConcurrentMark::markFromRoots() 内で(のみ)使用されている.
実際のマーク処理は CMTask クラスに丸投げしている (See: CMTask).
See: here for details
G1GC の ConcurrentMarkThread (の Live Data Counting 処理) で使用される補助クラス(StackObjクラス) (See: here for details).
処理対象の HeapRegion 内で生きているオブジェクトの量を計算する.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class CalcLiveObjectsClosure: public HeapRegionClosure {
以下の箇所で(のみ)使用されている.
See: here for details
G1GC の ConcurrentMarkThread (の Live Data Counting 処理) で使用される補助クラス (See: here for details).
処理対象の HeapRegion 内で生きているオブジェクトの量を計算する.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class G1ParFinalCountTask: public AbstractGangTask {
ConcurrentMark::cleanup() 内で(のみ)使用されている.
実際の計算処理は CalcLiveObjectsClosure に丸投げしている (See: CalcLiveObjectsClosure).
See: here for details
G1GC の ConcurrentMarkThread (の Cleanup 処理) で使用される補助クラス(StackObjクラス) (See: here for details).
Concurrent Marking 処理の後片付けを行う. 具体的には以下の通り.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class G1NoteEndOfConcMarkClosure : public HeapRegionClosure {
G1ParNoteEndTask::work() 内で(のみ)使用されている.
See: here for details
G1GC の ConcurrentMarkThread (の Cleanup 処理) で使用される補助クラス(StackObjクラス) (See: here for details).
Concurrent Marking 処理の後片付けを行う. 具体的には以下の通り.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class G1ParNoteEndTask: public AbstractGangTask {
ConcurrentMark::cleanup() 内で(のみ)使用されている.
実際の処理は G1NoteEndOfConcMarkClosure に丸投げしている (See: G1NoteEndOfConcMarkClosure).
See: here for details
G1GC の ConcurrentMarkThread (の Cleanup 処理) で使用される補助クラス(StackObjクラス) (See: here for details).
生きているオブジェクトがいない HeapRegion について, そこに付いている Remembered Set 用のデータ構造を解放する.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class G1ParScrubRemSetTask: public AbstractGangTask {
ConcurrentMark::cleanup() 内で(のみ)使用されている.
See: here for details
G1GC の ConcurrentMarkThread (の Final Marking Pause 処理) で使用される補助クラス (See: here for details).
参照オブジェクト(java.lang.ref オブジェクト)に対する処理に用いられる Closure クラス. まだマークが付いていないオブジェクトに対して, マークを付け, そこから辿れるものを marking stack にプッシュする.
なお, このクラスは参照オブジェクトの処理をシングルスレッドで行う場合に使用される. 処理をマルチスレッドで行う場合は, 代わりに G1CMParKeepAliveAndDrainClosure が使用される.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class G1CMKeepAliveClosure: public OopClosure {
ConcurrentMark::weakRefsWork() 内で(のみ)使用されている.
See: here for details
G1GC の ConcurrentMarkThread (の Final Marking Pause 処理) で使用される補助クラス (See: here for details).
参照オブジェクト(java.lang.ref オブジェクト)に対する処理に用いられる Closure クラス. Concurrent Marking 処理中に見つかった参照オブジェクト(java.lang.ref オブジェクト)について, それらから指されている先を再帰的にマークする.
なお, このクラスは参照オブジェクトの処理をシングルスレッドで行う場合に使用される. 処理をマルチスレッドで行う場合は, 代わりに G1CMParDrainMarkingStackClosure が使用される.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class G1CMDrainMarkingStackClosure: public VoidClosure {
ConcurrentMark::weakRefsWork() 内で(のみ)使用されている.
See: here for details
G1GC の ConcurrentMarkThread (の Final Marking Pause 処理) で使用される補助クラス (See: here for details).
参照オブジェクト(java.lang.ref オブジェクト)に対する処理に用いられる Closure クラス. Concurrent Marking 処理中に見つかった参照オブジェクト(java.lang.ref オブジェクト)について, それらから指されている先を再帰的にマークする.
なお, このクラスは参照オブジェクトの処理をマルチスレッドで行う場合に使用される. 処理をシングルスレッドで行う場合は, 代わりに G1CMKeepAliveClosure が使用される.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
// 'Keep Alive' closure used by parallel reference processing.
// An instance of this closure is used in the parallel reference processing
// code rather than an instance of G1CMKeepAliveClosure. We could have used
// the G1CMKeepAliveClosure as it is MT-safe. Also reference objects are
// placed on to discovered ref lists once so we can mark and push with no
// need to check whether the object has already been marked. Using the
// G1CMKeepAliveClosure would mean, however, having all the worker threads
// operating on the global mark stack. This means that an individual
// worker would be doing lock-free pushes while it processes its own
// discovered ref list followed by drain call. If the discovered ref lists
// are unbalanced then this could cause interference with the other
// workers. Using a CMTask (and its embedded local data structures)
// avoids that potential interference.
class G1CMParKeepAliveAndDrainClosure: public OopClosure {
G1RefProcTaskProxy::work() 内で(のみ)使用されている.
See: here for details
G1GC の ConcurrentMarkThread (の Final Marking Pause 処理) で使用される補助クラス (See: here for details).
参照オブジェクト(java.lang.ref オブジェクト)に対する処理に用いられる Closure クラス. Concurrent Marking 処理中に見つかった参照オブジェクト(java.lang.ref オブジェクト)について, それらから指されている先を再帰的にマークする.
なお, このクラスは参照オブジェクトの処理をマルチスレッドで行う場合に使用される. 処理をシングルスレッドで行う場合は, 代わりに G1CMDrainMarkingStackClosure が使用される.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class G1CMParDrainMarkingStackClosure: public VoidClosure {
G1RefProcTaskProxy::work() 内で(のみ)使用されている.
See: here for details
G1GC の ConcurrentMarkThread (の Final Marking Pause 処理) で使用される補助クラス (See: here for details).
Concurrent Marking 処理で使用される AbstractRefProcTaskExecutor クラス (つまり, Concurrent Marking 処理における参照オブジェクト(java.lang.ref オブジェクト)の処理をマルチスレッド化するためのクラス (See: AbstractRefProcTaskExecutor)).
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
// Implementation of AbstractRefProcTaskExecutor for G1
class G1RefProcTaskExecutor: public AbstractRefProcTaskExecutor {
ConcurrentMark::weakRefsWork() 内で(のみ)使用されている.
See: here for details
G1GC の ConcurrentMarkThread (の Final Marking Pause 処理) で使用される補助クラス (See: here for details).
参照オブジェクト(java.lang.ref オブジェクト)の処理をマルチスレッド化するための補助クラス (より具体的に言うと, コンストラクタ引数で渡された AbstractRefProcTaskExecutor::ProcessTask オブジェクトを実行するためのクラス (See: AbstractRefProcTaskExecutor::ProcessTask))
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class G1RefProcTaskProxy: public AbstractGangTask {
G1RefProcTaskExecutor::execute() 内で(のみ)使用されている.
参照オブジェクト処理のマルチスレッド化自体は G1RefProcTaskExecutor クラスが (WorkGang を用いて) 行っている.
各 G1RefProcTaskProxy オブジェクトには G1RefProcTaskExecutor クラスによって 実行すべき AbstractRefProcTaskExecutor::ProcessTask オブジェクトが 1つ割り当てられるので, 単にそれを実行するだけ.
See: here for details
G1GC の ConcurrentMarkThread (の Final Marking Pause 処理) で使用される補助クラス (See: here for details).
参照オブジェクト(java.lang.ref オブジェクト)の処理をマルチスレッド化するための補助クラス (より具体的に言うと, コンストラクタ引数で渡された AbstractRefProcTaskExecutor::EnqueueTask オブジェクトを実行するためのクラス (See: AbstractRefProcTaskExecutor::EnqueueTask))
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class G1RefEnqueueTaskProxy: public AbstractGangTask {
G1RefProcTaskExecutor::execute() 内で(のみ)使用されている.
参照オブジェクト処理のマルチスレッド化自体は G1RefProcTaskExecutor クラスが (WorkGang を用いて) 行っている.
各 G1RefProcTaskProxy オブジェクトには G1RefProcTaskExecutor クラスによって 実行すべき AbstractRefProcTaskExecutor::EnqueueTask オブジェクトが 1つ割り当てられるので, 単にそれを実行するだけ.
See: here for details
G1GC の ConcurrentMarkThread (の Final Marking Pause 処理) で使用される補助クラス (See: here for details).
Final Marking 処理を行う.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class CMRemarkTask: public AbstractGangTask {
ConcurrentMark::checkpointRootsFinalWork() 内で(のみ)使用されている.
See: here for details
デバッグ用(開発時用)のクラス (#ifndef PRODUCT 時にしか定義されない).
PrintReachableObjectClosure クラス内で使用される補助クラス. 処理対象の oop に関する情報を出力する (mark されているかどうか, アドレスが TAMS よりも前かどうか, 等).
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
#ifndef PRODUCT
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class PrintReachableOopClosure: public OopClosure {
PrintReachableObjectClosure::do_object() 内で(のみ)使用されている.
See: here for details
デバッグ用(開発時用)のクラス (#ifndef PRODUCT 時にしか定義されない).
PrintReachableRegionClosure クラス内で使用される補助クラス. 処理対象のオブジェクト, 及びそのオブジェクト内のポインタフィールド(oop)に関する情報を出力する (mark されているかどうか, アドレスが TAMS よりも前かどうか, 等).
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
#ifndef PRODUCT
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class PrintReachableObjectClosure : public ObjectClosure {
PrintReachableRegionClosure::doHeapRegion() 内で(のみ)使用されている.
オブジェクト内のポインタフィールドの処理については, PrintReachableOopClosure に丸投げしている (See: PrintReachableOopClosure).
See: here for details
デバッグ用(開発時用)のクラス (#ifndef PRODUCT 時にしか定義されない).
処理対象の HeapRegion 内にある全てのオブジェクトの情報を出力する (mark されているかどうか, アドレスが TAMS よりも前かどうか, 等).
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
#ifndef PRODUCT
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class PrintReachableRegionClosure : public HeapRegionClosure {
ConcurrentMark::print_reachable() 内で(のみ)使用されている.
実際の出力処理は PrintReachableObjectClosure に丸投げしている (See: PrintReachableObjectClosure).
See: here for details
G1CollectedHeap の Minor GC 処理("Evacuation Pause" 処理)で使用される Closure クラス (See: here for details).
Minor GC 時に, 残っている Concurrent Marking 処理を完了させるための Closure クラス.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class CMGlobalObjectClosure : public ObjectClosure {
ConcurrentMark::drainAllSATBBuffers() 内で(のみ)使用されている (See: here for details).
See: here for details
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class CSMarkOopClosure: public OopClosure {
各 CSMarkBitMapClosure オブジェクトの _oop_cl フィールドに(のみ)格納されている.
CSMarkBitMapClosure::do_bit() 内で(のみ)使用されている.
See: here for details
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class CSMarkBitMapClosure: public BitMapClosure {
各 CompleteMarkingInCSHRClosure オブジェクトの _bit_cl フィールドに(のみ)格納されている.
CompleteMarkingInCSHRClosure::doHeapRegion() 内で(のみ)使用されている.
See: here for details
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class CompleteMarkingInCSHRClosure: public HeapRegionClosure {
ConcurrentMark::complete_marking_in_collection_set() 内で(のみ)使用されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている.
(略) (See: here for details) -> G1CollectedHeap::evacuate_collection_set() -> ConcurrentMark::complete_marking_in_collection_set()
See: here for details
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
class ClearMarksInHRClosure: public HeapRegionClosure {
ConcurrentMark::complete_marking_in_collection_set() 内で(のみ)使用されている.
See: here for details
G1GC の ConcurrentMarkThread (の Concurrent Marking 処理と Final Marking Pause 処理) で使用される補助クラス (See: here for details).
マークされているオブジェクト (= CMBitMap の該当箇所が立っているオブジェクト) から再帰的に辿れる範囲をマークするための Closure クラス.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
// Closure for iteration over bitmaps
class CMBitMapClosure : public BitMapClosure {
CMTask::do_marking_step() 内で(のみ)使用されている (See: here for details).
See: here for details
G1GC の ConcurrentMarkThread (の Concurrent Marking 処理と Final Marking Pause 処理) で使用される補助クラス (See: here for details).
処理対象のオブジェクトにマークを付ける (= CMBitMap の該当箇所のビットを立てる). また, 既に処理を終えた HeapRegion 内を指している場合には, 再調査の必要があるので, local queue への登録も行う.
なお, このクラスは ObjectClosure (つまり, 処理対象は oop). 処理対象が oop* の場合には CMOopClosure が使用される.
また, このクラスは現状では SATB buffer の処理にしか使用されていない (SATB 方式の write barrier で記録された(変更前の)ポインタフィールドの値に対して, その差し先にマークを付ける処理).
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
// Closure for iterating over objects, currently only used for
// processing SATB buffers.
class CMObjectClosure : public ObjectClosure {
CMTask::drain_satb_buffers() 内で(のみ)使用されている (See: here for details).
See: here for details
G1GC の ConcurrentMarkThread (の Concurrent Marking 処理と Final Marking Pause 処理) で使用される補助クラス (See: here for details).
処理対象のオブジェクトにマークを付ける (= CMBitMap の該当箇所のビットを立てる). また, 既に処理を終えた HeapRegion 内を指している場合には, 再調査の必要があるので, local queue への登録も行う.
なお, このクラスは OopClosure (つまり, 処理対象は oop*). 処理対象が oop の場合には CMObjectClosure が使用される.
((cite: hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp))
// Closure for iterating over object fields
class CMOopClosure : public OopClosure {
CMTask::do_marking_step() 内で(のみ)使用されている (より正確に言うと, そこから呼び出される CMTask::scan_object() 内で(のみ)使用されている) (See: here for details).
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.