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

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

Nic*_*las 3

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

  • sun.management:类型= 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 的附加信息。