これらは, JIT Compiler 用のクラス. より具体的に言うと, 不要になった JIT 生成コード(nmethod)を回収するためのクラス (See: here for details).
不要になった JIT 生成コード(nmethod)を回収するためのクラス (より正確には, そのための機能を納めた名前空間(AllStatic クラス)) (See: here for details).
回収対象は, アンロードされたメソッドや "not entrant" になった nmethod, zombie 化された nmethod, 及びそれらを指している Inline cache, 等.
((cite: hotspot/src/share/vm/runtime/sweeper.hpp))
// An NmethodSweeper is an incremental cleaner for:
// - cleanup inline caches
// - reclamation of unreferences zombie nmethods
//
class NMethodSweeper : public AllStatic {
以下の箇所で(のみ)使用されている.
* 回収処理の開始 (毎回の Safepoint 時の実施) SafepointSynchronize::do_cleanup_tasks() -> NMethodSweeper::scan_stacks() * CompilerBroker によるインクリメンタルな回収処理 CompileQueue::get() -> NMethodSweeper::possibly_sweep() * nmethod に変化があった場合の処理 nmethod::make_unloaded() -> NMethodSweeper::notify() nmethod::make_not_entrant_or_zombie() -> NMethodSweeper::notify() * nmethod の zombie 化のための処理 nmethod::mark_as_seen_on_stack() -> NMethodSweeper::traversal_count() nmethod::can_not_entrant_be_converted() -> NMethodSweeper::traversal_count() * CodeCache が一杯になった場合の処理 CompileBroker::compiler_thread_loop() -> CompileBroker::handle_full_code_cache() -> NMethodSweeper::handle_full_code_cache() -> VMThread::execute() -> (略) (See: here for details) -> VM_HandleFullCodeCache::doit() -> NMethodSweeper::speculative_disconnect_nmethods() -> NMethodSweeper::handle_full_code_cache() -> (同上) ciEnv::register_method() -> CompileBroker::handle_full_code_cache() -> (同上) AdapterHandlerLibrary::get_adapter() -> CompileBroker::handle_full_code_cache() -> (同上) AdapterHandlerLibrary::create_native_wrapper() -> CompileBroker::handle_full_code_cache() -> (同上)
See: here for details
デバッグ用(開発時用)のクラス (#ifdef ASSERT 時にしか定義されない).
NMethodSweeper クラス内で使用される補助クラス. NMethodSweeper クラスに関するログ情報の記録/出力を行う.
((cite: hotspot/src/share/vm/runtime/sweeper.cpp))
#ifdef ASSERT
((cite: hotspot/src/share/vm/runtime/sweeper.cpp))
// Sweeper logging code
class SweeperRecord {
_records という大域変数に(のみ)格納されている.
(正確には, このフィールドは SweeperRecord の配列を格納するフィールド. この中に, 使用される全ての SweeperRecord オブジェクトが格納されている)
NMethodSweeper::possibly_sweep() 内で(のみ)生成されている.
なお, このクラスは (デバッグ時であることに加えて) LogSweeper オプションが指定されている場合にしか生成されない.
現在は, NMethodSweeper::record_sweep() 内で(のみ)記録されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている.
SWEEP() マクロ -> NMethodSweeper::record_sweep()
((cite: hotspot/src/share/vm/runtime/sweeper.cpp))
#define SWEEP(nm) record_sweep(nm, __LINE__)
以下の箇所で(のみ)出力されている.
See: here for details
NMethodSweeper クラス内で使用される補助クラス.
スタックフレームのスキャン処理中に 「もう "not entrant" になっているメソッドのフレーム」 を見つけたら印を入れる Closure クラス
((cite: hotspot/src/share/vm/runtime/sweeper.cpp))
class MarkActivationClosure: public CodeBlobClosure {
mark_activation_closure という大域変数に(のみ)格納されている.
(mark_activation_closure 大域変数は, ポインタ型ではなく実体なので, 初期段階で自動的に生成される)
NMethodSweeper::scan_stacks() 内で(のみ)使用されている.
行う処理は「nmethod でかつ not entrant になっているメソッドのフレーム」を見つけたら印を入れるだけ.
See: here for details
See: here for details
NMethodSweeper クラス内で使用される補助クラス.
ソースコード中のあるスコープの間だけ, 処理中の nmethod がアンロードされないようにしておくためのクラス(StackObjクラス).
((cite: hotspot/src/share/vm/runtime/sweeper.cpp))
class NMethodMarker: public StackObj {
NMethodSweeper::process_nmethod() 内で(のみ)使用されている.
コンストラクタで CompilerThread::_scanned_nmethod フィールドに処理対象の nmethod をセットし, デストラクタで NULL に戻しているだけ.
((cite: hotspot/src/share/vm/runtime/sweeper.cpp))
NMethodMarker(nmethod* nm) {
_thread = CompilerThread::current();
_thread->set_scanned_nmethod(nm);
}
~NMethodMarker() {
_thread->set_scanned_nmethod(NULL);
}
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.