有了最近的Sun JVM(1.6),是否可以获取GC线程信息?
-
08-10-2019 - |
题
使用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时间的细节获得。对不起...