hotspot/src/share/vm/runtime/thread.cpp
(なお, Threads::print_on() は現状では VM_PrintThreads::doit() 内からしか呼び出されない)
// Threads::print_on() is called at safepoint by VM_PrintThreads operation.
void Threads::print_on(outputStream* st, bool print_stacks, bool internal_format, bool print_concurrent_locks) {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
char buf[32];
{- -------------------------------------------
(1) (トレース出力)
---------------------------------------- -}
st->print_cr(os::local_time_string(buf, sizeof(buf)));
st->print_cr("Full thread dump %s (%s %s):",
Abstract_VM_Version::vm_name(),
Abstract_VM_Version::vm_release(),
Abstract_VM_Version::vm_info_string()
);
st->cr();
{- -------------------------------------------
(1) (#ifndef SERIALGC であり, かつ print_concurrent_locks 引数も true であれば)
ConcurrentLocksDump.dump_at_safepoint() を呼び出して
現在ロックされているシンクロナイザ一覧を取得しておく.
---------------------------------------- -}
#ifndef SERIALGC
// Dump concurrent locks
ConcurrentLocksDump concurrent_locks;
if (print_concurrent_locks) {
concurrent_locks.dump_at_safepoint();
}
#endif // SERIALGC
{- -------------------------------------------
(1) 処理対象の JavaThread を全て辿り, JavaThread::print_on() でスレッドの情報を出力する.
print_stacks 引数が true の場合は,
JavaThread::trace_stack() または JavaThread::print_stack_on() も呼び出して,
スタックの情報も出力する
(どちらを呼び出すかは internal_format 引数の値で決まる).
print_concurrent_locks 引数が true の場合は,
ConcurrentLocksDump::print_locks_on() も呼び出して,
ロックされているシンクロナイザの情報も出力する.
---------------------------------------- -}
ALL_JAVA_THREADS(p) {
ResourceMark rm;
p->print_on(st);
if (print_stacks) {
if (internal_format) {
p->trace_stack();
} else {
p->print_stack_on(st);
}
}
st->cr();
#ifndef SERIALGC
if (print_concurrent_locks) {
concurrent_locks.print_locks_on(p, st);
}
#endif // SERIALGC
}
{- -------------------------------------------
(1) VMThread::print_on() を呼んで, VMThread の情報を出力する.
---------------------------------------- -}
VMThread::vm_thread()->print_on(st);
st->cr();
{- -------------------------------------------
(1) CollectedHeap::print_gc_threads_on() (を各サブクラスがオーバーライドしたもの) を呼んで,
GC スレッドの情報を出力する.
---------------------------------------- -}
Universe::heap()->print_gc_threads_on(st);
{- -------------------------------------------
(1) WatcherThread が NULL でなければ,
WatcherThread::print_on() を呼んで WatcherThread の情報を出力する.
---------------------------------------- -}
WatcherThread* wt = WatcherThread::watcher_thread();
if (wt != NULL) wt->print_on(st);
st->cr();
{- -------------------------------------------
(1) CompileBroker::print_compiler_threads_on() を呼んで CompilerThread の情報を出力する.
---------------------------------------- -}
CompileBroker::print_compiler_threads_on(st);
{- -------------------------------------------
(1) 以上の出力内容をフラッシュ.
---------------------------------------- -}
st->flush();
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.