使用最新的Sun JVM(1.6),是否可以获取GC线程信息?

时间:2010-10-16 02:46:15

标签: java garbage-collection jmx thread-dump

使用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获取有关垃圾收集线程的信息?

2 个答案:

答案 0 :(得分:2)

这是Java 1.5+ Sun(HotSpot)JVM特有的。 在要监视的MBeanServer中注册MBean sun.management.HotspotInternal 。这将触发这些HotSpot内部mbeans的注册:

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

HotspotThreading MBean有一个名为 InternalThreadCpuTimes 的属性,它是HotSpot内部线程的映射.GC线程可以通过名称进行标识。例如,在我正在运行的JVM中,它们被称为:

  • GC任务线程#1(ParallelGC)
  • GC任务线程#0(ParallelGC)

映射的值是每个线程的CPU时间。

HotSpotMemory MBean还有一个名为 InternalMemoryCounters 的属性,其中包含一些关于GC的其他信息。

答案 1 :(得分:1)

第一步是使用verbosegc: java -verbose:gc -XX:+PrintGCDetails,它将为您提供有关GC操作中消耗的(挂钟)时间以及操作类型(完整或增量)的信息。您的问题似乎在于询问您是否可以通过编程方式获取它 - 可能通过管理I / F获取一些信息。

编辑添加:其中一些可通过MemoryMXBean获得,但不是GC时间的细节。对不起......