Up Top

Serviceability 機能 : HotSpot Monitoring and Management Interface (JMM) : JMM 用のネイティブライブラリの初期化処理 (JMM Interface の取得処理)


概要(Summary)

Platform MXBean クラスは "JMM Interface" を介して HotSpot にアクセスする (See: here for details). この "JMM Interface" は, 内部的には「jmm 用の関数ポインタを格納した構造体 (JmmInterface型)」として実装されている. この構造体は HotSpot 内に static に確保されている.

この "JMM Interface" は JMM 関係の初期化処理で取得される. 取得するのは libmanagement.so という動的リンクライブラリで, これが sun.management パッケージ内のクラス用のネイティブライブラリになっている.

この取得処理の流れは以下の通り.

  1. libmanagement.so がダイナミックロードされる

  2. libmanagement.so の JNI_OnLoad() 内で JVM_GetManagement() が呼び出され, jmm interface へのポインタが取得される.

(取得されたポインタは libmanagement.so 内の jmm_interface という変数に束縛される)

実際の Platform MXBean クラスの処理では, この jmm_interface 変数経由で HotSpot 内にアクセスが行われる.

備考(Notes)

以下の構造体が "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
    };

備考(Notes)

libmanagement.so は jdk/src/share/native/sun/management 下のファイルから作られる (See: here for details).

処理の流れ (概要)(Execution Flows : Summary)

初期化処理の流れは以下の通り.

JNI_OnLoad()
-> JVM_GetManagement()
   -> Management::get_jmm_interface()

処理の流れ (詳細)(Execution Flows : Details)

JNI_OnLoad()

See: here for details

JVM_GetManagement()

See: here for details

Management::get_jmm_interface()

See: here for details


This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.