Edd*_*die 5 java garbage-collection jmx thread-dump
使用JRockit,您可以通过任何方式获取完整的线程列表,所有这些方法都包含有关垃圾收集线程的信息:
1)向Thread
班级询问信息:
Thread.getAllStackTraces();
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
3)使用JMX获取列表:
ThreadMXBean THREAD_MX_BEAN = ManagementFactory.getThreadMXBean();
long[] tids = THREAD_MX_BEAN.getAllThreadIds();
ThreadInfo[] tinfos = THREAD_MX_BEAN.getThreadInfo(tids);
Run Code Online (Sandbox Code Playgroud)
4)CTRL-BREAK
但是,使用Sun JVM - 至少是最近的Java 6版本 - 只有CTRL-BREAK似乎包括垃圾收集线程和VM Periodic Task线程.我发现监视GC线程使用的CPU非常有用,这样我的应用程序就可以检测并记录GC何时占用大部分CPU时间.如果没有此信息,您只知道GC何时超过某些设定的阈值.
如果我甚至可以找到GC线程的线程ID,那么JMX可能会提供我需要的其他信息(除非这些线程有不同之处).例如,使用方法:
long threadId = tids[0];
long cpuTime = THREAD_MX_BEAN.getThreadCpuTime(threadId);
Run Code Online (Sandbox Code Playgroud)
有谁知道如何 - 或者是否已知不可能 - 使用Sun JVM获取有关垃圾收集线程的信息?
这是特定于 Java 1.5+ Sun (HotSpot) JVM 的。在您要监视的 MBeanServer 中注册 MBean sun.management.HotspotInternal 。这将触发这些 HotSpot 内部 mbean 的注册:
HotspotThreading MBean 有一个名为InternalThreadCpuTimes的属性,它是HotSpot 内部线程的映射。GC 线程可通过名称来识别。例如,在我现在运行的 JVM 中,它们被称为:
映射的值是每个线程的 CPU 时间。
HotSpotMemory MBean 还有一个名为InternalMemoryCounters的属性,其中包含一些有关 GC 的附加信息。