使用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非常有用,因此我的应用程序可以在使用大多数CPU时间时检测和记录。没有这些信息,您只知道GC何时超过某些设置阈值。

如果我什至可以找到GC线程的线程ID,那么JMX可能会提供我需要的其余信息(除非这些线程有所不同)。例如,使用该方法:

long threadId = tids[0];
long cpuTime = THREAD_MX_BEAN.getThreadCpuTime(threadId);

有人知道如何使用Sun JVM获取有关垃圾收集线程的信息吗?

有帮助吗?

解决方案

这是特定于Java 1.5+太阳(热点)JVM的特定于。注册MBEAN sun.management.hotspotinternal 在您要监视的MBEANSERVER中。这将触发这些热点内部mbeans的注册:

  • 太阳。管理:type=hotspotClassloading
  • 太阳。管理:type = hotspotCompilation
  • 太阳。管理:type=hotspotmemory
  • Sun.Management:Type = hotspotruntime
  • 太阳。管理:type=hotspotthreading

hotspotthreading mbean有一个属性称为 内部线程计算机 这是Hotspot内部线程的地图。GC线程可通过名称识别。例如,在我现在正在运行的JVM中,它们被称为:

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

地图的值是每个线程的CPU时间。

hotspotmemory mbean也有一个称为的属性 InternalMemoryCounters 还有一些有关GC的信息。

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top