Up Top

Serviceability 機能 : HotSpot Monitoring and Management Interface (JMM) : 各種 Platform MXBean クラスの処理 : スレッド毎のコンテンション時間/待機時間の取得処理 (java.lang.management.ThreadInfo.get*{Count|Time}() の処理)


概要(Summary)

JSR-174 の ThreadInfo オブジェクトには, スレッドの実行時間に関して, 以下の4種類の情報取得用メソッドが定義されている.

これらの情報は, HotSpot 内部では ThreadStatistics オブジェクトが管理している. ThreadInfo オブジェクトのメソッドと ThreadStatistics オブジェクト内の情報は以下のように対応する.

ThreadStatistics オブジェクトの contended_enter_count フィールド, 及び _contendedenter_timer フィールドに対応.

これらのフィールドは, 以下の2つの情報の合算値を格納している (See: JavaThreadBlockedOnMonitorEnterState).

ThreadStatistics オブジェクトの monitor_wait_count フィールドと _sleep_count フィールド, 及び _monitorwait_timer フィールドと _sleep_timer フィールドに対応.

より正確に言うと ThreadInfo のメソッドはそれぞれのフィールドの値の合計値に対応 (getWaitedCount() は monitor_wait_count フィールドと sleep_count フィールドの合計値. getWaitedTime() は _monitor_wait_timer フィールドと _sleeptimer フィールドの合計値). なお, 実際に値を合計する処理は initializeThreadInfo_constructor_arguments() 関数内で行われている (See: initialize_ThreadInfo_constructor_arguments()))

これらのフィールドは, 以下の情報を格納している.

備考(Notes)

(ThreadStatistics オブジェクト内の情報は ThreadSnapshot オブジェクトにコピーされ, 最終的に java.lang.management.ThreadInfo オブジェクトへとコピーされている (See: here for details))

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

記録処理の有効化

sun.management.ThreadImpl.setThreadContentionMonitoringEnabled()
-> sun.management.ThreadImpl.setThreadContentionMonitoringEnabled0()
   -> Java_sun_management_ThreadImpl_setThreadContentionMonitoringEnabled0()
      -> jmm_SetBoolAttribute()  (JMM_THREAD_CONTENTION_MONITORING を引数として呼び出される)
         -> ThreadService::set_thread_monitoring_contention()

値の記録処理

(See: here and here for details)
-> ObjectMonitor::enter()
   -> JavaThreadBlockedOnMonitorEnterState::JavaThreadBlockedOnMonitorEnterState()
   -> JavaThreadBlockedOnMonitorEnterState::~JavaThreadBlockedOnMonitorEnterState()
(See: here for details)
-> ObjectMonitor::notify()
   -> ObjectWaiter::wait_reenter_begin()
      -> JavaThreadBlockedOnMonitorEnterState::wait_reenter_begin()
(See: here for details)
-> ObjectMonitor::notifyAll()
   -> ObjectWaiter::wait_reenter_begin()
      -> (同上)
(See: here for details)
-> ObjectMonitor::wait()
   -> ObjectWaiter::wait_reenter_end()
      -> JavaThreadBlockedOnMonitorEnterState::wait_reenter_end()
java.lang.Object.wait()
-> JVM_MonitorWait()
   -> JavaThreadInObjectWaitState::JavaThreadInObjectWaitState()
   -> JavaThreadInObjectWaitState::~JavaThreadInObjectWaitState()
sun.misc.Unsafe.park()
-> Unsafe_Park()
   -> JavaThreadParkedState::JavaThreadParkedState()
   -> JavaThreadParkedState::~JavaThreadParkedState()
java.lang.Thread.sleep()
-> JVM_Sleep()
   -> JavaThreadSleepState::JavaThreadSleepState()
   -> JavaThreadSleepState::~JavaThreadSleepState()

値の java.lang.management.ThreadInfo オブジェクト内へのコピー処理

(See: here for details)

値の取得処理

java.lang.management.ThreadInfo.getBlockedCount()
-> ThreadInfo オブジェクトのフィールドにコピーされた値を返すだけ
java.lang.management.ThreadInfo.getBlockedTime()
-> ThreadInfo オブジェクトのフィールドにコピーされた値を返すだけ
java.lang.management.ThreadInfo.getWaitedCount()
-> ThreadInfo オブジェクトのフィールドにコピーされた値を返すだけ
java.lang.management.ThreadInfo.getWaitedTime()
-> ThreadInfo オブジェクトのフィールドにコピーされた値を返すだけ

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

sun.management.ThreadImpl.setThreadContentionMonitoringEnabled()

(#Under Construction) See: here for details

Java_sun_management_ThreadImpl_setThreadContentionMonitoringEnabled0()

See: here for details

ThreadService::set_thread_monitoring_contention()

See: here for details

JavaThreadBlockedOnMonitorEnterState::JavaThreadBlockedOnMonitorEnterState()

(#Under Construction)

JavaThreadBlockedOnMonitorEnterState::~JavaThreadBlockedOnMonitorEnterState()

(#Under Construction)

JavaThreadBlockedOnMonitorEnterState::wait_reenter_begin()

(#Under Construction)

JavaThreadBlockedOnMonitorEnterState::wait_reenter_end()

(#Under Construction)

JavaThreadInObjectWaitState::JavaThreadInObjectWaitState()

(#Under Construction)

JavaThreadInObjectWaitState::~JavaThreadInObjectWaitState()

(#Under Construction)

JavaThreadParkedState::JavaThreadParkedState()

(#Under Construction)

JavaThreadParkedState::~JavaThreadParkedState()

(#Under Construction)

JavaThreadSleepState::JavaThreadSleepState()

(#Under Construction)

JavaThreadSleepState::~JavaThreadSleepState()

(#Under Construction)

java.lang.management.ThreadInfo.getBlockedCount()

See: here for details

java.lang.management.ThreadInfo.getBlockedTime()

See: here for details

java.lang.management.ThreadInfo.getWaitedCount()

See: here for details

java.lang.management.ThreadInfo.getWaitedTime()

See: here for details


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