代码之家  ›  专栏  ›  技术社区  ›  Eddie

对于最近的Sun JVM(1.6),是否可以获取GC线程信息?

  •  5
  • Eddie  · 技术社区  · 14 年前

    使用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-断裂

    然而,使用Sun JVM——至少最近的Java 6发布——只有CTRL中断似乎包含垃圾收集线程和VM周期任务线程。我发现监视GC线程使用的CPU很有用,这样我的应用程序可以在GC使用大部分CPU时间时检测和记录。如果没有这些信息,您只知道何时GC超过了某些设置的阈值。

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

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

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

    2 回复  |  直到 14 年前
        1
  •  2
  •   Nicholas    14 年前

    这是特定于Java 1.5 + Sun(热点)JVM的。 注册MBean sun.management.hotspotinternal公司 在MBeanServer中,您要从中监视。这将触发这些热点内部MBean的注册:

    • sun.management:type=hotspotclassloading
    • sun.management:type=hotspotcompilation
    • sun.management:type=热点内存
    • sun.management:type=热点运行时间
    • sun.management:type=hotspotthreading

    这个 热点螺纹 MBean有一个名为 内部线程CPU时间 这是热点内部线程的映射。GC线程可以通过名称进行标识。例如,在我现在运行的JVM中,它们被称为:

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

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

    这个 热斑存储器 MBean还具有一个名为 内部内存计数器 它还有一些关于GC的附加信息。

        2
  •  1
  •   andersoj    14 年前

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

    编辑添加:有些可以通过memoryMxBean获得,但不包括GC时间的细节。对不起的。。。