这主要与Oracle Java 8 JVM有关。假设我无权访问日志。 Java不在详细模式下运行,并且未记录stdin / stderr。
正在运行的JVM中是否有任何地方可以保留上一个GC事件的时间戳?还是其他任何可能指示上一次GC事件发生的时间?
我只想知道上一次GC事件发生多久了。区分不同类型的GC事件的奖励点。
答案 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等工具使用的工具。