これらは, G1CollectedHeap の Garbage Collection 処理で使用される補助クラス(Closure クラス).
なお, これらのクラスは以下のような継承関係を持つ.
OopsInGenClosure (<= これは別ファイルで定義されているクラス)
OopClosure (<= これは別ファイルで定義されているクラス)
G1CollectedHeap の処理で使用される補助クラス.
指定された HeapRegion 内の oop をスキャンする Closure クラスの基底クラス (OopsInGenClosure の HeapRegion 版といった感じ).
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp))
// A class that scans oops in a given heap region (much as OopsInGenClosure
// scans oops in a generation.)
class OopsInHeapRegionClosure: public OopsInGenClosure {
See: here for details
G1CollectedHeap の Minor GC 処理("Evacuation Pause" 処理)で使用される Closure クラスの基底クラス (より正確には G1ParTask::work() 内で使用される Closure クラスの基底クラス) (See: here for details).
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp))
class G1ParClosureSuper : public OopsInHeapRegionClosure {
スーパークラスである OopsInHeapRegionClosure クラスのフィールドに加えて, 以下のようなフィールドを持つ.
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp))
G1CollectedHeap* _g1;
G1RemSet* _g1_rem;
ConcurrentMark* _cm;
G1ParScanThreadState* _par_scan_state;
See: here for details
G1CollectedHeap の Minor GC 処理("Evacuation Pause" 処理)で使用される Closure クラス (See: here for details).
処理対象のポインタが collection set 内を差していれば, コンストラクタに渡された G1ParScanThreadState オブジェクト内のキューに登録する.
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp))
class G1ParPushHeapRSClosure : public G1ParClosureSuper {
G1ParTask::work() 内で(のみ)使用されている (実際に使用されるのは, そこから呼び出される G1RemSet::oops_into_collection_set_do() の中) (See: here for details).
See: here for details
G1CollectedHeap の Minor GC 処理("Evacuation Pause" 処理)で使用される Closure クラス (See: here for details).
オブジェクトのコピー後に, そのオブジェクト内のフィールドに対して処理を行う Closure.
(G1ParPushHeapRSClosure に似ているが, collection set 内を差していない場合の処理もあるという点が違う.)
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp))
// This closure is applied to the fields of the objects that have just been copied.
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp))
class G1ParScanClosure : public G1ParClosureSuper {
以下の箇所で(のみ)使用されている (現在は「他の Closure クラスから間接的に呼び出される」という形でのみ使用されている) (See: here for details).
以下の箇所に(のみ)格納されている.
See: here for details
G1CollectedHeap の Minor GC 処理("Evacuation Pause" 処理)で使用される Closure クラス (See: here for details).
ポインタの配列を処理する際に, 少しずつ処理を行う(= 配列中の一部だけを taskqueue に入れ, 残りを遅延評価する)場合の処理を実装した Closure (より具体的に言うと, 処理途中のポインタ配列を受け取り, その中からある程度のポインタを取り出して taskqueue に入れ, 残りを pending 状態のポインタ配列として残す Closure).
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp))
class G1ParScanPartialArrayClosure : public G1ParClosureSuper {
G1ParTask::work() 内で(のみ)使用されている (実際に使用されるのは, そこから呼び出される G1ParScanThreadState::deal_with_reference() の中) (See: here for details).
See: here for details
G1CollectedHeap の Minor GC 処理("Evacuation Pause" 処理)で使用される Closure クラス(の基底クラス) (See: here for details).
オブジェクトのコピー処理を行う.
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp))
class G1ParCopyHelper : public G1ParClosureSuper {
内部には, Copy 処理のための以下のメソッドが定義されている (See: here for details).
Initial Marking Pause の処理で使用されるメソッド. (Concurrent Marking 処理のために) マークビットに live だと印を付ける (詳細は ConcurrentMark::grayRoot() の宣言部のコメント参照).
処理対象のオブジェクトをコピーするメソッド.
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp))
template <class T> void mark_forwardee(T* p);
oop copy_to_survivor_space(oop obj);
See: here for details
G1CollectedHeap の Minor GC 処理("Evacuation Pause" 処理)で使用される Closure クラス (See: here for details).
G1ParCopyHelper クラスの具象サブクラス. G1CollectedHeap の Minor GC における実際のコピー処理を行う (といっても, 実際のコピー処理はスーパークラスの G1ParCopyHelper に丸投げだったりするが...).
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp))
template<bool do_gen_barrier, G1Barrier barrier,
bool do_mark_forwardee>
class G1ParCopyClosure : public G1ParCopyHelper {
なお以下のような型も使われるが, これは G1ParCopyClosure の別名 (G1ParCopyClosure はテンプレート引数によって 2*3*2 = 12 通りのクラスが作れる. それらに対して便利な別名が定義されている).
((cite: hotspot/src/share/vm/gc_implementation/g1/g1_specialized_oop_closures.hpp))
typedef G1ParCopyClosure<false, G1BarrierEvac, false> G1ParScanHeapEvacClosure;
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp))
typedef G1ParCopyClosure<false, G1BarrierNone, false> G1ParScanExtRootClosure;
typedef G1ParCopyClosure<true, G1BarrierNone, false> G1ParScanPermClosure;
typedef G1ParCopyClosure<false, G1BarrierRS, false> G1ParScanHeapRSClosure;
typedef G1ParCopyClosure<false, G1BarrierNone, true> G1ParScanAndMarkExtRootClosure;
typedef G1ParCopyClosure<true, G1BarrierNone, true> G1ParScanAndMarkPermClosure;
typedef G1ParCopyClosure<false, G1BarrierRS, true> G1ParScanAndMarkHeapRSClosure;
// This is the only case when we set skip_cset_test. Basically, this
// closure is (should?) only be called directly while we're draining
// the overflow and task queues. In that case we know that the
// reference in question points into the collection set, otherwise we
// would not have pushed it on the queue. The following is defined in
// g1_specialized_oop_closures.hpp.
// typedef G1ParCopyClosure<false, G1BarrierEvac, false, true> G1ParScanHeapEvacClosure;
// We need a separate closure to handle references during evacuation
// failure processing, as we cannot asume that the reference already
// points into the collection set (like G1ParScanHeapEvacClosure does).
typedef G1ParCopyClosure<false, G1BarrierEvac, false> G1ParScanHeapEvacFailureClosure;
G1ParTask::work() 内で(のみ)使用されている (See: here for details).
template 引数の意味は以下の通り. なお, barrier フィールドの型である G1Barrier は以下のような enum.
((cite: hotspot/src/share/vm/gc_implementation/g1/g1_specialized_oop_closures.hpp))
enum G1Barrier {
G1BarrierNone, G1BarrierRS, G1BarrierEvac
};
bool do_gen_barrier
do_oop() 時に OopsInGenClosure::par_do_barrier() を呼び出すかどうか. true なら呼び出す.
G1Barrier barrier
do_oop() 時に Remembered Set を更新するかどうか.
bool do_mark_forwardee
do_oop() 時に Initial Marking Pause 処理を行うかどうか (= G1ParCopyHelper::mark_forwardee() を呼び出すかどうか). true なら呼び出す.
なお, barrier フィールドの値として G1BarrierRS を使用するのは以下の別名時のみ (しかし, これらは使われている形跡が無いんだが... 一応 G1ParTask::work() 内で生成はされてるが...).
また, G1BarrierEvac を使用するのは以下の別名時のみ
G1ParTask::work() 内で生成され, G1ParScanThreadState::deal_with_reference() 内で使用されている.
G1ParTask::work() 内で生成され, G1ParCopyHelper::copy_to_survivor_space() 内で使用されている.
((cite: hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp))
template <class T> void deal_with_reference(T* ref_to_scan) {
...
_evac_cl->set_region(r);
_evac_cl->do_oop_nv(ref_to_scan);
((cite: hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp))
oop G1ParCopyHelper::copy_to_survivor_space(oop old) {
...
if (obj_ptr == NULL) {
// This will either forward-to-self, or detect that someone else has
// installed a forwarding pointer.
OopsInHeapRegionClosure* cl = _par_scan_state->evac_failure_closure();
return _g1->handle_evacuation_failure_par(cl, old);
}
See: here for details
G1CollectedHeap の処理で使用される補助クラス.
他の OopClosure と組み合わせて使用される Closure クラス. ある OopClosure オブジェクトを基にして 「処理対象のポインタが collection set 内を差している場合にのみ, その OopClosure の処理を実行する OopClosure オブジェクト」を生成する.
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp))
class FilterIntoCSClosure: public OopClosure {
以下の箇所で(のみ)使用されている.
コンストラクタ引数で OopClosure が指定され, それが FilterIntoCSClosure::do_oop_nv() 内で使用される.
See: here for details
See: here for details
See: here for details
コメントによると, FILTERINTOCSCLOSURE_DOHISTOGRAMCOUNT の処理はパフォーマンス上クリティカルなので, コンパイル時に on/off するように, とのこと (そして現状ではデフォルトは off).
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp))
// This must a ifdef'ed because the counting it controls is in a
// perf-critical inner loop.
#define FILTERINTOCSCLOSURE_DOHISTOGRAMCOUNT 0
See: here for details
?? (このクラスは使用箇所が見当たらない...)
FilterIntoCSClosure クラスに類似したクラス. 違いは, OopClosure ではなく OopsInHeapRegionClosure をラップする点.
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp))
class FilterInHeapRegionAndIntoCSClosure : public OopsInHeapRegionClosure {
コンストラクタ引数で OopsInHeapRegionClosure が指定され, それが FilterInHeapRegionAndIntoCSClosure::do_oop_nv() 内で使用される.
See: here for details
FilterInHeapRegionAndIntoCSClosure::do_oop_nv() を呼び出すだけ.
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp))
virtual void do_oop(oop* p) { do_oop_nv(p); }
virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
See: here for details
See: here for details
?? (このクラスは使用箇所が見当たらない...)
FilterInHeapRegionAndIntoCSClosure クラスに類似したクラス. 違いは, ポインタの差し先が collection set 内ではない場合に, もし差し先が young region でもなければ ConcurrentMark::grayRoot() を呼び出す点.
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp))
class FilterAndMarkInHeapRegionAndIntoCSClosure : public OopsInHeapRegionClosure {
コンストラクタ引数で OopsInHeapRegionClosure が指定され, それが FilterAndMarkInHeapRegionAndIntoCSClosure::do_oop_nv() 内で使用される.
See: here for details
FilterAndMarkInHeapRegionAndIntoCSClosure::do_oop_nv() を呼び出すだけ.
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp))
virtual void do_oop(oop* p) { do_oop_nv(p); }
virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
See: here for details
See: here for details
G1CollectedHeap の処理で使用される補助クラス.
他の OopClosure と組み合わせて使用される Closure クラス. ある OopClosure オブジェクトを基にして 「処理対象のポインタが指定されたアドレス範囲 [bottom, end) の外を指している場合にのみ, その OopClosure の処理を行う OopClosure オブジェクト」を生成する.
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp))
class FilterOutOfRegionClosure: public OopClosure {
以下の箇所で(のみ)使用されている.
コンストラクタ引数で OopClosure が指定され, それが FilterOutOfRegionClosure::do_oop_nv() 内で使用される.
See: here for details
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp))
virtual void do_oop(oop* p) { do_oop_nv(p); }
virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
See: here for details
なお FILTEROUTOFREGIONCLOSURE_DOHISTOGRAMCOUNT の処理は (おそらく FILTERINTOCSCLOSURE_DOHISTOGRAMCOUNT と同様のパフォーマンス上の理由で) コンパイル時に on/off するようになっている (そして現状ではデフォルトは off).
((cite: hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp))
#define FILTEROUTOFREGIONCLOSURE_DOHISTOGRAMCOUNT 0
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.