Top


定義場所(file name)

hotspot/src/share/vm/runtime/thread.cpp

説明(description)

(なお, Threads::print_on() は現状では VM_PrintThreads::doit() 内からしか呼び出されない)

// Threads::print_on() is called at safepoint by VM_PrintThreads operation.

名前(function name)

void Threads::print_on(outputStream* st, bool print_stacks, bool internal_format, bool print_concurrent_locks) {

本体部(body)

  {- -------------------------------------------
  (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.