JSR-174 の ThreadInfo オブジェクトには, スレッドの実行時間に関して, 以下の4種類の情報取得用メソッドが定義されている.
これらの情報は, HotSpot 内部では ThreadStatistics オブジェクトが管理している. ThreadInfo オブジェクトのメソッドと ThreadStatistics オブジェクト内の情報は以下のように対応する.
ThreadStatistics オブジェクトの contended_enter_count フィールド, 及び _contendedenter_timer フィールドに対応.
これらのフィールドは, 以下の2つの情報の合算値を格納している (See: JavaThreadBlockedOnMonitorEnterState).
monitorenter 命令, もしくは synchronized 指定されたメソッドの開始時に, ロックが既に取得済みだったために待たされた回数 (及び, 全実行時間中のロック取得のために待機していた時間の合計値)
java.lang.Object.notify() もしくは java.lang.Object.notifyAll() で起こされた回数 (及び, 全実行時間中の, java.lang.Object.notify{-All}() で起こされてから 実際に java.lang.Object.wait() の待機が解けるまでの時間の合計値)
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()))
これらのフィールドは, 以下の情報を格納している.
monitor_wait_count フィールド, 及び _monitorwait_timer フィールド
以下の2つの情報の合算値を記録.
sleep_count フィールド, 及び _sleeptimer フィールド
java.lang.Thread.sleep() が呼び出された回数 (及び, 全実行時間中の sleep() で待機していた時間の合計値) (See: JavaThreadSleepState)
(<= そのほかに, JVM_Sleep() は awt 関係の xIOError() という関数内でも使われてはいるようだが... #TODO)
ThreadStatistics クラス自体は情報を保持しておくためのクラスであり, 情報の更新は JavaThreadStatusChanger クラスのサブクラスが担当している (See: JavaThreadInObjectWaitState, JavaThreadParkedState, JavaThreadBlockedOnMonitorEnterState, JavaThreadSleepState).
Java プログラムから取得する際には java.lang.management.ThreadInfo オブジェクトとして取得される.
(ThreadStatistics オブジェクト内の情報は ThreadSnapshot オブジェクトにコピーされ, 最終的に java.lang.management.ThreadInfo オブジェクトへとコピーされている (See: here for details))
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()
(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 オブジェクトのフィールドにコピーされた値を返すだけ
(#Under Construction) See: here for details
See: here for details
See: here for details
(#Under Construction)
(#Under Construction)
(#Under Construction)
(#Under Construction)
(#Under Construction)
(#Under Construction)
(#Under Construction)
(#Under Construction)
(#Under Construction)
(#Under Construction)
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.