hotspot/src/share/vm/prims/jvmtiEnvBase.cpp
void
VM_GetAllStackTraces::doit() {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
ResourceMark rm;
_final_thread_count = 0;
{- -------------------------------------------
(1) 全ての JavaThread に対して VM_GetMultipleStackTraces::fill_frames() を呼び出し,
処理対象として登録しておく.
(ただし, 既に死んでいる JavaThread については登録しない.
また HotSpot が内部的に使用するスレッド(= is_hidden_from_external_view() が true) についても登録しない)
---------------------------------------- -}
for (JavaThread *jt = Threads::first(); jt != NULL; jt = jt->next()) {
oop thread_oop = jt->threadObj();
if (thread_oop != NULL &&
!jt->is_exiting() &&
java_lang_Thread::is_alive(thread_oop) &&
!jt->is_hidden_from_external_view()) {
++_final_thread_count;
// Handle block of the calling thread is used to create local refs.
fill_frames((jthread)JNIHandles::make_local(_calling_thread, thread_oop),
jt, thread_oop);
}
}
{- -------------------------------------------
(1) VM_GetMultipleStackTraces::allocate_and_fill_stacks() を呼び出して,
スタックトレース情報を取得する.
---------------------------------------- -}
allocate_and_fill_stacks(_final_thread_count);
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.