gpt4 book ai didi

java - 使用最新的 Sun JVM(1.6),是否有可能获得 GC 线程信息?

转载 作者:搜寻专家 更新时间:2023-10-31 20:23:57 24 4
gpt4 key购买 nike

使用 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 很有用,因此我的应用程序可以检测并记录 GC 何时使用了大部分 CPU 时间。如果没有这些信息,您只能知道 GC 何时超过特定的设定阈值。

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

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

有谁知道如何——或者如果已知不可能——使用 Sun JVM 获取有关垃圾收集线程的信息?

最佳答案

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

  • 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(并行 GC)
  • GC 任务线程 #0(并行 GC)

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

HotSpotMemory MBean 还有一个名为 InternalMemoryCounters 的属性,它包含一些关于 GC 的额外信息。

关于java - 使用最新的 Sun JVM(1.6),是否有可能获得 GC 线程信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3947467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com