这主要是关于Oracle Java 8 JVM。假设我无权访问日志。 Java未以详细模式运行,并且未记录stdin / stderr。
在运行的JVM中是否有任何位置保存最后一次GC事件的时间戳?或者其他任何可能表明最后一次GC事件发生的事情?
我只是想知道上一次GC事件发生多久以前。用于区分不同类型的GC事件的奖励点。
当您使用适用于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使用的工具。