使用 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 版本——只有 CTRL-BREAK 似乎包括垃圾收集线程和 VM 定期任务线程。我发现监视 GC 线程使用的 CPU 很有用,因此我的应用程序可以检测和记录 GC 何时使用大部分 CPU 时间。如果没有这些信息,您只能知道 GC 何时超过某些设置的阈值。
如果我什至可以找出 GC 线程的线程 ID,那么 JMX 可能会提供我需要的其余信息(除非这些线程有什么不同)。例如,使用方法:
long threadId = tids[0];
long cpuTime = THREAD_MX_BEAN.getThreadCpuTime(threadId);
有谁知道如何(或者如果已知不可能)使用 Sun JVM 获取有关垃圾收集线程的信息?