6

JRockitを使用すると、どのような方法でもスレッドの完全なリストを取得できます。これらのすべての手段には、ガベージコレクションスレッドに関する情報が含まれています。

1)Threadクラスに情報を求める:

Thread.getAllStackTraces();

2)ThreadGroupその情報を取得するために使用する:

ThreadGroup root = Thread.currentThread().getThreadGroup();
while (root.getParent() != null) {
    root = root.getParent();
}
Thread[] list = new Thread[root.activeCount() + 5];
root.enumerate(list, true);

3)JMXを使用してリストを取得します。

ThreadMXBean THREAD_MX_BEAN = ManagementFactory.getThreadMXBean();
long[] tids = THREAD_MX_BEAN.getAllThreadIds();
ThreadInfo[] tinfos = THREAD_MX_BEAN.getThreadInfo(tids);

4)CTRL-BREAK

ただし、Sun JVM(少なくとも最近のJava 6リリース)を使用すると、ガベージコレクションスレッドとVM定期タスクスレッドが含まれているのはCTRL-BREAKだけのようです。GCスレッドによって使用されるCPUを監視して、GCがCPU時間の大部分を使用しているときにアプリケーションが検出してログに記録できるようにすると便利です。この情報がないと、GCが特定の設定されたしきい値を超えた場合にのみわかります。

GCスレッドのスレッドIDを見つけることができれば、JMXはおそらく必要な残りの情報を提供します(これらのスレッドに何か違いがない限り)。たとえば、次の方法を使用します。

long threadId = tids[0];
long cpuTime = THREAD_MX_BEAN.getThreadCpuTime(threadId);

Sun JVMを使用してガベージコレクションスレッドに関する情報を取得する方法(または不可能であることがわかっている場合)を知っている人はいますか?

4

2 に答える 2

2

これは、Java 1.5以降のSun(HotSpot)JVMに固有です。監視対象のMBeanServerにMBeansun.management.HotspotInternalを登録します。これにより、これらのHotSpot内部mbeanの登録がトリガーされます。

  • sun.management:type = HotspotClassLoading
  • sun.management:type = HotspotCompilation
  • sun.management:type = HotspotMemory
  • sun.management:type = HotspotRuntime
  • sun.management:type = HotspotThreading

HotspotThreading MBeanには、 HotSpotの内部スレッドのマップであるInternalThreadCpuTimesという属性があります。GCスレッドは名前で識別できます。たとえば、現在実行しているJVMでは、次のように呼ばれます。

  • GCタスクスレッド#1(ParallelGC)
  • GCタスクスレッド#0(ParallelGC)

マップの値は、各スレッドのCPU時間です。

HotSpotMemory MBeanには、GCに関するいくつかの追加情報を持つInternalMemoryCountersという属性もあります。

于 2010-11-06T14:06:37.073 に答える
1

最初のステップは、verbosegc:を使用する java -verbose:gc -XX:+PrintGCDetailsことです。これにより、GC操作で消費される(実時間)時間、および操作のタイプ(フルまたはインクリメンタル)に関する情報が得られます。あなたの質問は、プログラムで取得できるかどうかを尋ねているようです。おそらく、管理I/Fを介していくつかの情報を取得できます。

追加のために編集:これの一部はMemoryMXBeanを介して利用できますが、GC時間の詳細は利用できません。ごめん...

于 2010-10-16T02:54:45.050 に答える