【问题标题】:PrintGCApplicationStoppedTimePrintGCApplicationStoppedTime
【发布时间】:2017-02-28 17:10:19
【问题描述】:

我有 JVM 选项 -XX:+PrintGCApplicationStoppedTime 打印真正的“GC 停止世界时间”。

例子:

  • 应用程序线程停止的总时间:0.0018219 秒
  • 应用程序线程停止的总时间:0.0016542 秒
  • 应用程序线程停止的总时间:0.0015797 秒

我需要通过java代码计算“GC stop the world”。我该怎么做?

【问题讨论】:

  • 解析日志文件?
  • 没有。我需要以编程方式获取此值。
  • @AndrewS 不。我需要以编程方式获取此值。

标签: java multithreading garbage-collection jvm


【解决方案1】:

请注意,PrintGCApplicationStoppedTime 打印的是 安全点时间,而不是 GC 时间
详情请见this answer

您可以通过特定于 JDK(即不支持)的 MXBean 获得安全点的累积时间。该值等于Total time for which application threads were stopped 消息中打印的所有数字的总和。

sun.management.HotspotRuntimeMBean runtime =
        sun.management.ManagementFactoryHelper.getHotspotRuntimeMBean();

System.out.println("Safepoint time:  " + runtime.getTotalSafepointTime() + " ms");
System.out.println("Safepoint count: " + runtime.getSafepointCount());

【讨论】:

  • 此代码执行相同的操作: for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) { log.info("Time: bean={} time={} count={}", gc. getName(), gc.getCollectionCount(), gc.getCollectionCount());我需要“停止应用程序线程的总时间:VALUE 秒”和“停止线程花费:VALUE 秒”中的值。
  • @ArtemZatsev 不,GarbageCollectorMXBean 值不同。 1)并发GC时间不包含在“应用程序线程已停止”中。 2) 安全点暂停不仅发生在 GC 期间,还发生在many other reasons
  • 不清楚你想要哪个值。最后一个?还是所有值?
  • @AndreiPangin 我需要与“应用程序线程停止的总时间:0.0018219 秒”中完全相同的值。我需要这个“0.0018219”值。也许你有一些想法如何得到它?
  • @ArtemZatsev 这取决于您所说的“正确”是什么意思。 runtime.getTotalSafepointTime() 返回相当精确的停止世界计数器。这是我个人用于监控生产系统的方法。只需定期读取此计数器并减去两个后续值。