使用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 Periodic Task线程。我发现监视GC线程使用的CPU很有用,这样我的应用程序就可以检测并记录GC何时占用大部分CPU时间。如果没有此信息,您只知道GC何时超过某些设定的阈值。
如果我甚至可以找到GC线程的线程ID,那么JMX可能会提供我需要的其他信息(除非这些线程有不同之处)。例如,使用方法:
long threadId = tids[0];
long cpuTime = THREAD_MX_BEAN.getThreadCpuTime(threadId);
有没有人知道如何 - 或者知道不可能 - 使用Sun JVM获取有关垃圾收集线程的信息?
答案 0 :(得分:2)
这是Java 1.5+ Sun(HotSpot)JVM特有的。 在要监视的MBeanServer中注册MBean sun.management.HotspotInternal 。这将触发这些HotSpot内部mbeans的注册:
HotspotThreading MBean有一个名为 InternalThreadCpuTimes 的属性,它是HotSpot内部线程的映射.GC线程可以通过名称进行标识。例如,在我正在运行的JVM中,它们被称为:
映射的值是每个线程的CPU时间。
HotSpotMemory MBean还有一个名为 InternalMemoryCounters 的属性,其中包含一些关于GC的其他信息。
答案 1 :(得分:1)
第一步是使用verbosegc:
java -verbose:gc -XX:+PrintGCDetails
,它将为您提供有关GC操作中消耗的(挂钟)时间以及操作类型(完整或增量)的信息。您的问题似乎在于询问您是否可以通过编程方式获取它 - 可能通过管理I / F获取一些信息。
编辑添加:其中一些可通过MemoryMXBean获得,但不是GC时间的细节。对不起......