これらは, 標準クラスライブラリ(JDK)のバージョン情報, 及び HotSpot の終了時処理を管理するためのクラス.
(なおここでの JDK とは標準クラスライブラリ(libjava.so)のこと)
使用している JDK のバージョンを管理するクラス (なおここでの JDK とは標準クラスライブラリ(libjava.so)のこと).
JDK のバージョンを検出し, その情報を格納しておく役割がある.
(なおコメントによると, JDK 6 以降では libjava.so が GetVersion (正確には JDK_GetVersionInfo0 ?) という関数を提供してくれているため簡単に検出できるが, それ以前のバージョンだと少し難しい, とのこと.
このため, JDK 6 以降のものについては JDK_Version::initialize() が呼ばれた段階で完全に分かるようになるが, JDK 5 以前のものでは JDK_Version::fully_initialize() が呼ばれるまでは詳細は分からない (JDK 5 以前だということしか分からない) 状態になっている.)
((cite: hotspot/src/share/vm/runtime/java.hpp))
/**
* Discovering the JDK_Version during initialization is tricky when the
* running JDK is less than JDK6. For JDK6 and greater, a "GetVersion"
* function exists in libjava.so and we simply call it during the
* 'initialize()' call to find the version. For JDKs with version < 6, no
* such call exists and we have to probe the JDK in order to determine
* the exact version. This probing cannot happen during late in
* the VM initialization process so there's a period of time during
* initialization when we don't know anything about the JDK version other than
* that it less than version 6. This is the "partially initialized" time,
* when we can answer only certain version queries (such as, is the JDK
* version greater than 5? Answer: no). Once the JDK probing occurs, we
* know the version and are considered fully initialized.
*/
class JDK_Version VALUE_OBJ_CLASS_SPEC {
JDK_Version クラスの _current フィールド (static フィールド) に(のみ)格納されている.
((cite: hotspot/src/share/vm/runtime/java.hpp))
static JDK_Version _current;
(JDK_Version クラスの _current フィールドは, ポインタ型ではなく実体なので, 初期段階で自動的に生成される)
Threads::create_vm() 内で(のみ)初期化されている.
(HotSpot の起動時処理) (See: here for details) -> Threads::create_vm() -> JDK_Version_init() -> JDK_Version::initialize() (libjava.so が GetVersion() を提供してくれていれば, ここで検出して設定する) -> init_globals() -> universe2_init() -> Universe::genesis() (libjava.so が GetVersion() を提供してくれていなければ, ここでバージョンを推定して設定する) -> JDK_Version::fully_initialize()
See: here for details
See: here for details
See: here for details
定義されているフィールドは以下の通り.
((cite: hotspot/src/share/vm/runtime/java.hpp))
// In this class, we promote the minor version of release to be the
// major version for releases >= 5 in anticipation of the JDK doing the
// same thing. For example, we represent "1.5.0" as major version 5 (we
// drop the leading 1 and use 5 as the 'major').
uint8_t _major;
uint8_t _minor;
uint8_t _micro;
uint8_t _update;
uint8_t _special;
uint8_t _build;
// If partially initialized, the above fields are invalid and we know
// that we're less than major version 6.
bool _partially_initialized;
bool _thread_park_blocker;
bool _post_vm_init_hook_enabled;
See: here for details
?? (このクラスは使用箇所が見当たらないような...)
((cite: hotspot/src/share/vm/runtime/java.cpp))
class ExitProc : public CHeapObj {
(java.io.File.deleteOnExit() から使われると書いてあるが, 実際には使われていない. File.deleteOnExit() は java.lang.Shutdown.shutdown() から呼び出される shutdown hook で実現されている)
((cite: hotspot/src/share/vm/runtime/thread.cpp))
// > run VM level shutdown hooks (they are registered through JVM_OnExit(),
// currently the only user of this mechanism is File.deleteOnExit())
(<= どうやら, File.deleteOnExit() は, 当初は ExitProc で実装されていた模様. しかし, Java 1.3 で shutdown hook が導入され, その後 File.deleteOnExit() も shutdown hook ベースの実装に修正された模様. 参考URL)
exit_procs という大域変数に(のみ)格納されている.
(正確には, このフィールドは ExitProc の線形リストを格納するフィールド. ExitProc オブジェクトは _next フィールドで次の ExitProc オブジェクトを指せる構造になっている. 生成した ExitProc オブジェクトは全てこの線形リスト内に格納されている)
register_on_exit_function() 内で(のみ)生成されている. そして, この関数は現在は以下のパスで(のみ)呼び出されている.
(が, この JVM_OnExit() は使われていないような...?? #TODO)
JVM_OnExit() -> register_on_exit_function()
before_exit() 内で(のみ)使用されている.
(exit_procs 内の全ての ExitProc が取り出され, ExitProc::evaluate() が呼び出される)
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.