(以下の内容はほとんど HotSpot Runtime Overview の受け売り. こちらも参照のこと)
DestroyJavaVM() による HotSpot の終了処理は以下のようになる.
(なおこの関数は HotSpot を終了させるために launcher によって呼び出される. HotSpot 内部で深刻なエラーが起こった場合は, HotSpot 自身によって呼び出されることもある)
現在のスレッドが唯一のユーザスレッド(non-daemon thread to execute)になるまで待つ
java.lang.Shutdown.shutdown() を呼び出し, shutdown 用のフック関数やfinalizer処理を行う.
before_exit() を呼び出し, 以下の処理を行う.
JavaThread::exit() を呼び出し, 以下の処理を行う (この段階で HotSpot は Java のコードが実行不可能な状態になる).
VMThread を停止させる.
(これにより VM は safepoint 状態になり, Compiler スレッドも停止される)
まだネイティブコードを実行中のスレッドのために, _vm_exited フラグをセットして終了したと通達する
このスレッドを削除する
exit_globals() で IO や PerfMonitor 用のリソースを解放する
リターンする
(なお, JNI の DestroyJavaVM() 関数は HotSpot 内では jni_DestroyJavaVM() という名前で定義されている)
(実際の処理の大半は Threads::destroy_vm() に実装されている)
jni_DestroyJavaVM() -> jni_AttachCurrentThread() -> Threads::destroy_vm() (← この中で実際の終了処理の全てが行われる) -> Universe::run_finalizers_on_exit() or JavaThread::invoke_shutdown_hooks() -> before_exit() -> -> JavaThread::exit() -> VMThread::wait_for_vm_thread_exit() -> VMThread::destroy() -> VM_Exit::set_vm_exited() -> notify_vm_shutdown() -> exit_globals()
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.