Platform MXBean クラスは "JMM Interface" を介して HotSpot にアクセスする (See: here for details). この "JMM Interface" は, 内部的には「jmm 用の関数ポインタを格納した構造体 (JmmInterface型)」として実装されている. この構造体は HotSpot 内に static に確保されている.
この "JMM Interface" は JMM 関係の初期化処理で取得される. 取得するのは libmanagement.so という動的リンクライブラリで, これが sun.management パッケージ内のクラス用のネイティブライブラリになっている.
この取得処理の流れは以下の通り.
libmanagement.so がダイナミックロードされる
libmanagement.so の JNI_OnLoad() 内で JVM_GetManagement() が呼び出され, jmm interface へのポインタが取得される.
(取得されたポインタは libmanagement.so 内の jmm_interface という変数に束縛される)
実際の Platform MXBean クラスの処理では, この jmm_interface 変数経由で HotSpot 内にアクセスが行われる.
以下の構造体が "JMM Interface" の実体.
(なお, 紛らわしいがこちらは libjvm.so 内の jmm_interface 変数. この変数へのポインタが取得されて libmanagement.so 内の jmm_interface 変数に束縛され, そちら経由で使用される)
((cite: hotspot/src/share/vm/services/management.cpp))
const struct jmmInterface_1_ jmm_interface = {
NULL,
NULL,
jmm_GetVersion,
jmm_GetOptionalSupport,
jmm_GetInputArguments,
jmm_GetThreadInfo,
jmm_GetInputArgumentArray,
jmm_GetMemoryPools,
jmm_GetMemoryManagers,
jmm_GetMemoryPoolUsage,
jmm_GetPeakMemoryPoolUsage,
jmm_GetThreadAllocatedMemory,
jmm_GetMemoryUsage,
jmm_GetLongAttribute,
jmm_GetBoolAttribute,
jmm_SetBoolAttribute,
jmm_GetLongAttributes,
jmm_FindMonitorDeadlockedThreads,
jmm_GetThreadCpuTime,
jmm_GetVMGlobalNames,
jmm_GetVMGlobals,
jmm_GetInternalThreadTimes,
jmm_ResetStatistic,
jmm_SetPoolSensor,
jmm_SetPoolThreshold,
jmm_GetPoolCollectionUsage,
jmm_GetGCExtAttributeInfo,
jmm_GetLastGCStat,
jmm_GetThreadCpuTimeWithKind,
jmm_GetThreadCpuTimesWithKind,
jmm_DumpHeap0,
jmm_FindDeadlockedThreads,
jmm_SetVMGlobal,
NULL,
jmm_DumpThreads,
jmm_SetGCNotificationEnabled
};
libmanagement.so は jdk/src/share/native/sun/management 下のファイルから作られる (See: here for details).
初期化処理の流れは以下の通り.
JNI_OnLoad() -> JVM_GetManagement() -> Management::get_jmm_interface()
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.