hotspot/src/share/vm/runtime/biasedLocking.cpp
// Returns MonitorInfos for all objects locked on this thread in youngest to oldest order
static GrowableArray<MonitorInfo*>* get_or_compute_monitor_info(JavaThread* thread) {
{- -------------------------------------------
(1) 以前の get_or_compute_monitor_info() の計算結果がキャッシュされているかもしれないため,
JavaThread::cached_monitor_info() を呼んで確認してみる.
もしキャッシュがあれば, 新しく計算する必要は無いので, キャッシュされていた内容をリターンするだけ.
(なお, このキャッシュはこの get_or_compute_monitor_info() の末尾でセットされている)
---------------------------------------- -}
GrowableArray<MonitorInfo*>* info = thread->cached_monitor_info();
if (info != NULL) {
return info;
}
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
info = new GrowableArray<MonitorInfo*>();
{- -------------------------------------------
(1) (以下で, last_java_vframe から初めて全ての Java レベルのスタックフレームを調べていく)
(なお, Java レベルのメソッドの frame をもたないことも有るので (例えば main() からリターンしてしまった後のメインスレッドとか)
まず last_Java_frame を持っていることを確認する.
持っていなければ, 以下の調査は行わない.)
---------------------------------------- -}
// It's possible for the thread to not have any Java frames on it,
// i.e., if it's the main thread and it's already returned from main()
if (thread->has_last_Java_frame()) {
RegisterMap rm(thread);
for (javaVFrame* vf = thread->last_java_vframe(&rm); vf != NULL; vf = vf->java_sender()) {
{- -------------------------------------------
(1.1) それぞれのフレーム内から使用中の BasicObjectLock の情報を集める
---------------------------------------- -}
GrowableArray<MonitorInfo*> *monitors = vf->monitors();
if (monitors != NULL) {
int len = monitors->length();
// Walk monitors youngest to oldest
for (int i = len - 1; i >= 0; i--) {
MonitorInfo* mon_info = monitors->at(i);
if (mon_info->owner_is_scalar_replaced()) continue;
oop owner = mon_info->owner();
if (owner != NULL) {
info->append(mon_info);
}
}
}
}
}
{- -------------------------------------------
(1) JavaThread::set_cached_monitor_info() を呼んで, 計算結果をキャッシュしておく.
(キャッシュした内容は, この get_or_compute_monitor_info() の先頭箇所で参照される)
---------------------------------------- -}
thread->set_cached_monitor_info(info);
{- -------------------------------------------
(1) リターン
---------------------------------------- -}
return info;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.