これらは, Garbage Collection 処理用の補助クラス. より具体的に言うと, 実際の GC 処理を行うクラス (See: here for details).
Garbage Collection 処理を行う VM_Operation クラスの基底クラス.
((cite: hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp))
class VM_GC_Operation: public VM_Operation {
((cite: hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp))
// VM_GC_Operation
// - implements methods common to all classes in the hierarchy:
// prevents multiple gc requests and manages lock on heap;
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
See: here for details
保守運用機能のためのクラス (関連する serviceability 機能からのみ使用される).
Java ヒープ内のオブジェクトに関する統計情報(どのクラスのインスタンスがどれだけ(何個および何バイト)存在しているか)を出力する.
((cite: hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp))
class VM_GC_HeapInspection: public VM_GC_Operation {
以下の箇所で使用されている.
保守運用機能用の関数. GC 実行前に呼び出され, 関連するコマンドラインオプションの値に応じてヒープの情報を出力する. PrintClassHistogramBeforeFullGC オプションが指定されていると, VM_GC_HeapInspection が呼び出される.
保守運用機能用の関数. GC 実行後に呼び出され, 関連するコマンドラインオプションの値に応じてヒープの情報を出力する. PrintClassHistogramAfterFullGC オプションが指定されていると, VM_GC_HeapInspection が呼び出される.
(これはシグナルハンドラ用の関数. スレッドダンプ処理等を行う)
PrintClassHistogram オプションが指定されていると, スレッドダンプ処理時(SIGBREAK の処理時)に VM_GC_HeapInspection が呼び出される
Attach API の "inspectheap" コマンドの処理を行う関数.
実際の処理は HeapInspection クラスに丸投げしているだけ (より正確には HeapInspection::heap_inspection() を呼び出しているだけ) (See: HeapInspection).
なお, VM_GC_Operation のサブクラスなのに GC との関係が薄いが, コンストラクタ引数で Full GC を実行してから調査するように要求されていた場合には, まず Full GC を実行してから HeapInspection を呼び出す (このため, 一応 GC を行う処理パスも存在する).
See: here for details
See: here for details
VM_GC_Operation クラスの具象サブクラスの1つ (See: here for details).
このクラスは, GenCollectedHeap 用 (より正確には, GenCollectedHeap において New/Old 領域からの確保に失敗した場合用. GC アルゴリズムとしては Serial, ParNew, Serial Old, CMS 等がここから呼び出される).
((cite: hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp))
class VM_GenCollectForAllocation: public VM_GC_Operation {
GenCollectorPolicy::mem_allocate_work() 内で(のみ)使用されている (See: here for details).
See: here for details
VM_GC_Operation クラスの具象サブクラスの1つ (See: here for details).
このクラスは, GenCollectedHeap 用 (より正確には, GenCollectedHeap において java.lang.System.gc() 等が呼び出された場合用. GC アルゴリズムとしては Serial Old がここから呼び出される).
((cite: hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp))
// VM operation to invoke a collection of the heap as a
// GenCollectedHeap heap.
class VM_GenCollectFull: public VM_GC_Operation {
GenCollectedHeap::collect_locked() 内で(のみ)使用されている (See: here for details).
See: here for details
VM_GC_Operation クラスの具象サブクラスの1つ (See: here for details).
このクラスは, SharedHeap 用 (より正確には, GenCollectedHeap や G1CollectedHeap において Perm 領域からの確保に失敗した場合用. GC アルゴリズムとしては Serial Old, CMS, G1GC 等がここから呼び出される).
((cite: hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp))
class VM_GenCollectForPermanentAllocation: public VM_GC_Operation {
PermGen::mem_allocate_in_gen() 内で(のみ)使用されている (See: here for details).
See: here for details
保守運用機能のためのクラス (DTrace 用および JVMTI 用のフック点を管理するためのクラス) (See: here, here and here for details).
DTrace や JVMTI のフック点の生成処理を簡単に行うための補助クラス(StackObjクラス). ソースコード上のスコープに連動して自動的にフック点を生成する.
((cite: hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp))
class SvcGCMarker : public StackObj {
コード中で SvcGCMarker 型の局所変数を宣言するだけ.
(以下の例のように GC 処理の開始前に局所変数が宣言される)
((cite: hotspot/src/share/vm/gc_implementation/parallelScavenge/vmPSOperations.cpp))
void VM_ParallelGCFailedAllocation::doit() {
SvcGCMarker sgcm(SvcGCMarker::MINOR);
...
_result = heap->failed_mem_allocate(_size, _is_tlab);
コンストラクタで VM_GC_Operation::notify_gc_begin() を, デストラクタで VM_GC_Operation::notify_gc_end() を呼び出す (VM_GC_Operation::notify_gc_begin() や VM_GC_Operation::notify_gc_end() は DTrace のフック点. それぞれ gc_begin と gc_end に対応).
また, JvmtiGCMarker 型のフィールドを保持しているため JvmtiGCMarker のコンストラクタ/デストラクタも呼び出される (この中で JVMTI のフック処理が行われる).
((cite: hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp))
SvcGCMarker(reason_type reason ) {
VM_GC_Operation::notify_gc_begin(reason == FULL);
}
~SvcGCMarker() {
VM_GC_Operation::notify_gc_end();
}
なおコンストラクタの方については, 「コンストラクタ引数として渡された reason が FULL かどうか」という情報も VM_GC_Operation::notify_gc_begin() に渡している. この reason は以下の 3通りの値を取る enum 値.
((cite: hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp))
typedef enum { MINOR, FULL, OTHER } reason_type;
((cite: hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.cpp))
// The same dtrace probe can't be inserted in two different files, so we
// have to call it here, so it's only in one file. Can't create new probes
// for the other file anymore. The dtrace probes have to remain stable.
void VM_GC_Operation::notify_gc_begin(bool full) {
HS_DTRACE_PROBE1(hotspot, gc__begin, full);
HS_DTRACE_WORKAROUND_TAIL_CALL_BUG();
}
void VM_GC_Operation::notify_gc_end() {
HS_DTRACE_PROBE(hotspot, gc__end);
HS_DTRACE_WORKAROUND_TAIL_CALL_BUG();
}
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.