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