safepoint 停止処理は, 多くの場合, スレッドの状態が遷移する際に行われる (つまり, 何らかの状態遷移が起こった際に Safepoint 処理が開始されていれば, そのスレッドは停止する).
スレッドの状態は JavaThreadState で表現されており, 以下のクラスがその遷移処理を担当している (これらのクラスのコンストラクタとデストラクタで遷移処理が行われる).
これらのクラスは, 内部的には ThreadStateTransition クラスの以下のメソッドを使用している.
ThreadInVMfromJava::ThreadInVMfromJava() -> (1) JavaThreadState を _thread_in_vm に変更 (この場合は, 中間的な状態を経ることなく直接遷移) -> ThreadStateTransition::trans_from_java() -> ThreadStateTransition::transition_from_java()
ThreadInVMfromJava::~ThreadInVMfromJava() -> (1) JavaThreadState を _thread_in_Java に戻す. (Safepoint が始まっていればここでブロックする) -> ThreadStateTransition::trans() -> ThreadStateTransition::transition() -> (1) JavaThreadState を引数で指定された値(この場合は _thread_in_vm_trans) に変更 (2) メモリアクセスの順序づけを行う -> OrderAccess::fence() or os::write_memory_serialize_page() が生成したコード (3) もし Safepoint が開始されていたらブロックする -> SafepointSynchronize::block() (4) JavaThreadState を引数で指定された値(この場合は _thread_in_Java) に変更 (1) 処理対象のスレッドが例外を出していたりサスペンドされたりしていないかチェックし, もし何か起きていたら対処する. -> JavaThread::has_special_runtime_exit_condition() -> JavaThread::handle_special_runtime_exit_condition()
ThreadInVMfromUnknown::ThreadInVMfromUnknown() -> ThreadStateTransition::transition_from_native() (<= ただし, カレントスレッドが JavaThread であり, かつ _thread_in_native の場合にのみこの呼び出しを行う. そうでなければ何もしない) -> (1) JavaThreadState を _thread_in_native_trans に変更 (1) メモリアクセスの順序づけを行う -> OrderAccess::fence() or InterfaceSupport::serialize_memory() が生成したコード (1) SafepointSynchronize::_state の値を確認し, Safepoint が始まっていればブロックする -> SafepointSynchronize::do_call_back() -> JavaThread::check_safepoint_and_suspend_for_native_trans() -> SafepointSynchronize::block() (1) JavaThreadState を引数で指定された値(この場合は _thread_in_vm) に変更
ThreadInVMfromUnknown::~ThreadInVMfromUnknown() -> ThreadStateTransition::transition_and_fence() (<= ただし, コンストラクタで状態変更を行った場合のみ, この呼び出しを行う. そうでなければ何もしない) -> (1) JavaThreadState を引数で指定された値(この場合は _thread_in_vm_trans) に変更 (2) メモリアクセスの順序づけを行う -> OrderAccess::fence() or InterfaceSupport::serialize_memory() が生成したコード (3) もし Safepoint が開始されていたらブロックする -> SafepointSynchronize::block() (4) JavaThreadState を引数で指定された値(この場合は _thread_in_native) に変更
ThreadInVMfromNative::ThreadInVMfromNative() -> ThreadStateTransition::trans_from_native() -> (1) JavaThreadState を _thread_in_vm に変更 -> ThreadStateTransition::transition_from_native() -> (上述) (この場合は, まず _thread_in_native_trans に変更した後, Safepoint チェックを経て, 最終的に _thread_in_vm に変更される)
ThreadInVMfromNative::~ThreadInVMfromNative() -> ThreadStateTransition::trans_and_fence() -> (1) JavaThreadState を _thread_in_native に変更 -> ThreadStateTransition::transition_and_fence() -> (上述) (この場合は, まず _thread_in_vm_trans に変更した後, Safepoint チェックを経て, 最終的に _thread_in_native に変更される)
ThreadToNativeFromVM::ThreadToNativeFromVM() -> (1) スタックフレームを辿れるようにしておく -> JavaFrameAnchor::make_walkable() (1) JavaThreadState を _thread_in_native に変更. -> ThreadStateTransition::trans_and_fence() -> (上述) (この場合は, まず _thread_in_vm_trans に変更した後, Safepoint チェックを経て, 最終的に _thread_in_native に変更される) (1) 処理対象のスレッドが例外を出していたりサスペンドされたりしていないかチェックし, もし何か起きていたら対処する. -> JavaThread::has_special_runtime_exit_condition() -> JavaThread::handle_special_runtime_exit_condition() (<= 引数を false で呼び出す)
ThreadToNativeFromVM::~ThreadToNativeFromVM() -> (1) JavaThreadState を _thread_in_vm に変更 -> ThreadStateTransition::transition_from_native() -> (上述) (この場合は, まず _thread_in_native_trans に変更した後, Safepoint チェックを経て, 最終的に _thread_in_vm に変更される)
ThreadBlockInVM::ThreadBlockInVM() -> (1) スタックフレームを辿れるようにしておく -> JavaFrameAnchor::make_walkable() (1) JavaThreadState を _thread_blocked に変更 -> ThreadStateTransition::trans_and_fence() -> (上述) (この場合は, まず _thread_in_vm_trans に変更した後, Safepoint チェックを経て, 最終的に _thread_blocked に変更される)
ThreadBlockInVM::~ThreadBlockInVM() -> (1) JavaThreadState を _thread_in_vm に変更 -> ThreadStateTransition::trans_and_fence() -> (上述) (この場合は, まず _thread_blocked_trans に変更した後, Safepoint チェックを経て, 最終的に _thread_in_vm に変更される)
-> ThreadInVMfromJavaNoAsyncException::ThreadInVMfromJavaNoAsyncException() (1) JavaThreadState を _thread_in_vm に変更 (この場合は, 中間的な状態を経ることなく直接遷移) -> ThreadStateTransition::trans_from_java() -> (上述)
-> ThreadInVMfromJavaNoAsyncException::~ThreadInVMfromJavaNoAsyncException() (1) JavaThreadState を _thread_in_Java に戻す. (Safepoint が始まっていればここでブロックする) -> ThreadStateTransition::trans() -> (上述) (この場合は, まず _thread_in_vm_trans に変更した後, Safepoint チェックを経て, 最終的に _thread_in_Java に変更される) (1) 処理対象のスレッドが例外を出していたりサスペンドされたりしていないかチェックし, もし何か起きていたら対処する. -> JavaThread::has_special_runtime_exit_condition() -> JavaThread::handle_special_runtime_exit_condition() (<= 引数を false で呼び出す)
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.