これらは, VM Operation 処理のためのクラス (See: here and here for details).
全ての VM Operation クラスの基底クラス.
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
class VM_Operation: public CHeapObj {
使用する際には, doit() メソッドをオーバーライドしたサブクラスを作ればいい.
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
virtual void doit() = 0;
See: here for details
java.lang.Thread の停止処理用 (java.lang.Thread.stop() 用) の補助クラス(VM_Operation クラス) (See: here for details).
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
class VM_ThreadStop: public VM_Operation {
Thread::send_async_exception() 内で(のみ)使用されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている.
* java.lang.Thread.stop() の処理 (略) (See: here for details) -> JVM_StopThread() -> Thread::send_async_exception() * JVMTI の StopThread() の処理 (略) (See: here for details) -> JvmtiEnv::StopThread() -> Thread::send_async_exception() * (?? #TODO) -> InlineCacheBuffer::new_ic_stub() -> Thread::send_async_exception()
See: here for details
ダミーの VM_Operation クラス. 処理は何も行わない.
Safepoint を発生させることで間接的に NMethodSweeper::scan_stacks() 等を実行したい, という時に使われる (See: SafepointSynchronize::do_cleanup_tasks()).
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
// dummy vm op, evaluated just to force a safepoint
class VM_ForceSafepoint: public VM_Operation {
以下の箇所で(のみ)使用されている.
(このクラス自体は何も処理はしない)
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
void doit() {}
See: here for details
ダミーの VM_Operation クラス. 処理は何も行わない.
Safepoint を発生させることで間接的に ObjectSynchronizer::deflate_idle_monitors() 等を実行したい, という時に使われる (See: SafepointSynchronize::do_cleanup_tasks()).
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
// dummy vm op, evaluated just to force a safepoint
class VM_ForceAsyncSafepoint: public VM_Operation {
InduceScavenge() 内で(のみ)使用されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている.
ObjectSynchronizer::inflate() -> ObjectSynchronizer::omAlloc() -> InduceScavenge()
(このクラス自体は何も処理はしない)
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
void doit() {}
See: here for details
JIT 生成されたコード(nmethod)に対する脱最適化処理(Deoptimization処理)で使用される補助クラス(VM_Operation クラス) (See: here for details).
CodeCache::mark_for_deoptimization() でマークを付けられた全ての nmethod (及びそれに依存している nmethod) に対して脱最適化を行う.
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
class VM_Deoptimize: public VM_Operation {
以下の箇所で(のみ)使用されている.
* (ダイナミックロード等で) クラス階層に変化があった場合 -> SystemDictionary::add_to_hierarchy() -> Universe::flush_dependents_on() * JVMTI のイベント通知処理のために interp_only_mode になる際 (See: here and here for details) VM_EnterInterpOnlyMode::doit()
See: here for details
JIT 生成されたコード(nmethod)に対する脱最適化処理(Deoptimization処理)で使用される補助クラス(VM_Operation クラス) (See: here for details).
指定されたスレッドの指定されたスタックフレームを脱最適化する.
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
// Deopt helper that can deoptimize frames in threads other than the
// current thread. Only used through Deoptimization::deoptimize_frame.
class VM_DeoptimizeFrame: public VM_Operation {
Deoptimization::deoptimize_frame() 内で(のみ)使用されている. この関数は, 現在は以下のパスで(のみ)呼び出されている.
* C1 の ...#TODO 処理 Runtime1::patch_code() -> Deoptimization::deoptimize_frame() * C1 の ...#TODO 処理 deopt_caller() -> Deoptimization::deoptimize_frame() * C1 の ...#TODO 処理 Runtime1::counter_overflow() -> Deoptimization::deoptimize_frame() * C1 の ...#TODO 処理 exception_handler_for_pc_helper() -> Deoptimization::deoptimize_frame() * C2 の ...#TODO 処理 OptoRuntime::deoptimize_caller_frame() -> Deoptimization::deoptimize_frame() * C2 生成コードでの Safepoint 処理中 (略) (See: here for details) -> SafepointSynchronize::handle_polling_page_exception() -> ThreadSafepointState::handle_polling_page_exception() -> Deoptimization::deoptimize_frame() * JVMTI の PopFrame() 関数の処理 (略) (See: here for details) -> JvmtiEnv::PopFrame() -> Deoptimization::deoptimize_frame() * JVMTI の ForceEarlyReturn*() 関数の処理 (略) (See: here for details) -> JvmtiEnvBase::force_early_return() -> JvmtiEnvBase::check_top_frame() -> Deoptimization::deoptimize_frame() * JVMTI の GetLocal*() 及び SetLocal*() 関数の処理 (略) (See: here for details) -> VM_GetOrSetLocal::doit() -> Deoptimization::deoptimize_frame()
See: here for details
NMethodSweeper クラス内で使用される補助クラス(VM_Operation クラス).
CodeCache が一杯になった際に実行され, 古い nmethod を CodeCache 内から廃棄する.
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
class VM_HandleFullCodeCache: public VM_Operation {
NMethodSweeper::handle_full_code_cache() 内で(のみ)使用されている.
NMethodSweeper::speculative_disconnect_nmethods() を呼び出すだけ.
((cite: hotspot/src/share/vm/runtime/vm_operations.cpp))
void VM_HandleFullCodeCache::doit() {
NMethodSweeper::speculative_disconnect_nmethods(_is_full);
}
See: here for details
デバッグ用(開発時用)のクラス (#ifndef PRODUCT 時にしか定義されない) (なお, このクラスは (デバッグ時であることに加えて) DeoptimizeALot オプションまたは DeoptimizeRandom オプションが指定されている場合にしか働かない).
VMEntryWrapper クラス内で使用される補助クラス(VM_Operation クラス).
全てのスタックフレーム(またはランダムで選んだスタックフレーム)を脱最適化する.
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
#ifndef PRODUCT
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
class VM_DeoptimizeAll: public VM_Operation {
InterfaceSupport::deoptimizeAll() 内で(のみ)使用されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている.
VMEntryWrapper()::~VMEntryWrapper() -> InterfaceSupport::deoptimizeAll()
なお JRT_ENTRY や IRT_ENTRY の度に実行すると重いので, InterfaceSupport::deoptimizeAll() では以下のタイミングで VM_DeoptimizeAll を実行することにしている模様
See: here for details
内部では以下の処理を行う.
なお, JavaThread::deoptimize() は, 全部のフレームに対して Deoptimization::deoptimize() を適用する関数 (DeoptimizeOnlyAt コマンドラインオプションで脱最適化の範囲を絞ることも出来る).
See: here for details
See: here for details
See: here for details
デバッグ用(開発時用)のクラス (#ifndef PRODUCT 時にしか定義されない). (なお, このクラスは (デバッグ時であることに加えて) ZombieALot オプションが指定されている場合にしか働かない).
VMEntryWrapper クラス内で使用される補助クラス(VM_Operation クラス).
呼び出したスレッドのスタックフレーム内を調べ, JIT 生成されたメソッドがあれば対応する JIT 生成コード(nmethod)を破棄する.
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
#ifndef PRODUCT
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
class VM_ZombieAll: public VM_Operation {
InterfaceSupport::zombieAll() 内で(のみ)使用されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている.
VMEntryWrapper()::~VMEntryWrapper() -> InterfaceSupport::zombieAll()
なお JRT_ENTRY や IRT_ENTRY の度に実行すると重いので, InterfaceSupport::zombieAll() では ZombieALotInterval 回に 1回実行することにしている模様.
See: here for details
JavaThread::make_zombies() を呼び出すだけ.
なお, JavaThread::make_zombies() は, 呼び出したスレッドのスタックフレーム内に JIT 生成されたメソッドがあれば nmthod::make_not_entrant() で強制的に破棄させる関数.
See: here for details
See: here for details
See: here for details
デバッグ用(開発時用)のクラス (#ifdef ASSERT 時にしか使用されない) (なお, このクラスは (デバッグ時であることに加えて) UnlinkSymbolsALot オプションが指定されている場合にしか働かない).
VMEntryWrapper クラス内で使用される補助クラス(VM_Operation クラス).
SymbolTable 中の参照されていないシンボル(dead symbol)を全て破棄させる.
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
class VM_UnlinkSymbols: public VM_Operation {
InterfaceSupport::unlinkSymbols() 内で(のみ)使用されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている.
VMEntryWrapper()::~VMEntryWrapper() -> InterfaceSupport::unlinkSymbols()
((cite: hotspot/src/share/vm/runtime/interfaceSupport.cpp))
void InterfaceSupport::unlinkSymbols() {
VM_UnlinkSymbols op;
VMThread::execute(&op);
}
SymbolTable::unlink() を呼び出して, SymbolTable 中の参照されていないシンボル(dead symbol)を全て破棄させるだけ.
See: here for details
See: here for details
?? (このクラスは使用箇所が見当たらない...)
デバッグ用(開発時用)のクラス.
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
class VM_Verify: public VM_Operation {
Universe::verify() を呼び出すだけ.
See: here for details
See: here for details
保守運用機能のためのクラス (Dynamic Attach 機能及びスレッドダンプ機能用のクラス).
HotSpot 内で稼働中の全スレッドについて, その実行状態(RUNNABLE, WAITING 等)とスタックトレースを出力する.
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
class VM_PrintThreads: public VM_Operation {
以下の箇所で(のみ)使用されている.
* スレッドダンプ機能 (略) (See: here for details) -> signal_thread_entry() * Attach API の threaddump コマンド (略) (See: here for details) -> attach_listener_thread_entry() -> thread_dump() * ?? (略) (?? 使われていない #TODO) -> JVM_DumpAllStacks()
Threads::print_on() を呼び出すだけ.
See: here for details
See: here for details
See: here for details
保守運用機能のためのクラス (Dynamic Attach 機能及びスレッドダンプ機能用のクラス).
現在の JNI Global References の情報を出力する.
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
class VM_PrintJNI: public VM_Operation {
以下の箇所で(のみ)使用されている.
* スレッドダンプ機能 (略) (See: here for details) -> signal_thread_entry() * Attach API の threaddump コマンド (略) (See: here for details) -> attach_listener_thread_entry() -> thread_dump()
JNIHandles::print_on() を呼び出すだけ.
See: here for details
See: here for details
保守運用機能のためのクラス (関連する JMM 機能, Dynamic Attach 機能及びスレッドダンプ機能用のクラス).
デッドロックしているスレッド群がいないか調べ, その結果を表示する.
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
class VM_FindDeadlocks: public VM_Operation {
以下の箇所で(のみ)使用されている.
* スレッドダンプ機能 (略) (See: here for details) -> signal_thread_entry() * Attach API の threaddump コマンド (略) (See: here for details) -> attach_listener_thread_entry() -> thread_dump() * JMM のデッドロック検出処理 (java.lang.management.ThreadMXBean.findDeadlockedThreads() および java.lang.management.ThreadMXBean.findMonitorDeadlockedThreads() の処理) (略) (See: here for details) -> jmm_FindDeadlockedThreads() -> find_deadlocks() (略) (See: here for details) -> jmm_FindMonitorDeadlockedThreads() -> find_deadlocks()
See: here for details
java.lang.Thread クラスの機能, 及び JMM の機能を実現するための補助クラス(VM_Operation クラス).
スレッドの情報を取得する (スタックトレース情報, 現在ロックしているシンクロナイザの一覧, 現在ロックしているオブジェクトモニターの一覧, etc).
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
class VM_ThreadDump : public VM_Operation {
以下の箇所で(のみ)使用されている.
* java.lang.Thread のスタックフレーム取得処理 (java.lang.Thread.getStackTrace(), java.lang.Thread.getAllStackTraces() の処理) (略) (See: here for details) -> ThreadService::dump_stack_traces() * JMM の java.lang.management.ThreadInfo オブジェクト取得処理 (java.lang.management.ThreadMXBean.getThreadInfo() および java.lang.management.ThreadMXBean.dumpAllThreads() の処理) (略) (See: here for details) -> jmm_GetThreadInfo() -> do_thread_dump() (略) (See: here for details) -> jmm_DumpThreads() (略) (See: here for details) -> jmm_DumpThreads() -> do_thread_dump()
See: here for details
HotSpot の終了処理で使用される補助クラス(VM_Operation クラス).
終了時の後始末を行う (See: here for details).
((cite: hotspot/src/share/vm/runtime/vm_operations.hpp))
class VM_Exit: public VM_Operation {
vm_exit() 内で(のみ)使用されている.
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.