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

问题描述 投票:2回答:1

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

在运行的JVM中是否有任何位置保存最后一次GC事件的时间戳?或者其他任何可能表明最后一次GC事件发生的事情?

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

java garbage-collection monitoring
1个回答
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已经运行管理代理或者可以通过Attach API访问(通常意味着在同一台计算机上运行),则它可以工作,因此可以稍后启动管理代理。这些选项也是VisualVM使用的工具。

© www.soinside.com 2019 - 2024. All rights reserved.