如何找到自从上一次使用JVM进行垃圾回收以来经过的时间?

时间:2019-04-08 22:42:11

标签: java garbage-collection monitoring

这主要与Oracle Java 8 JVM有关。假设我无权访问日志。 Java不在详细模式下运行,并且未记录stdin / stderr。

正在运行的JVM中是否有任何地方可以保留上一个GC事件的时间戳?还是其他任何可能指示上一次GC事件发生的时间?

我只想知道上一次GC事件发生多久了。区分不同类型的GC事件的奖励点。

1 个答案:

答案 0 :(得分:1)

如果您可以使用与Oracle Java 8 JVM兼容的解决方案,并且可以与其他人一起使用 ,则可以使用the GarbageCollectorMXBean platform extension。我已链接到JDK 11文档,因为该类未包含在JDK 8文档中,但是存在该类型并且可以使用以下解决方案。

final RuntimeMXBean rt = ManagementFactory.getRuntimeMXBean();
long base = rt.getStartTime();

for(GarbageCollectorMXBean gc: ManagementFactory.getGarbageCollectorMXBeans()) {
  if(gc instanceof com.sun.management.GarbageCollectorMXBean) {
    com.sun.management.GcInfo info =
        ((com.sun.management.GarbageCollectorMXBean)gc).getLastGcInfo();

    if(info != null) {
      System.out.printf("%-15s%tF %2$tT.%2$tL  (%6dms ago)%n",
        gc.getName(), base + info.getStartTime(), rt.getUptime()-info.getStartTime());
    }
  }
}

当我假装

System.gc();
System.out.println(System.getProperty("java.version"));

为了简单的运行,我得到了

1.8.0_131
PS Scavenge    2019-04-09 11:58:25.808  (    50ms ago)
PS MarkSweep   2019-04-09 11:58:25.809  (    74ms ago)

此信息也可以远程查询,另请参见Ways to Access MXBeans。如果JVM已运行Management Agent或通过Attach API可以访问JVM(通常意味着在同一台计算机上运行),则它可以工作,因此以后可以启动Management Agent。这些选项也是VisualVM等工具使用的工具。