【问题标题】:How do I find the time elapsed since the last garbage collection with a JVM?如何找到自上次使用 JVM 进行垃圾收集以来经过的时间?
【发布时间】:2019-04-08 22:42:10
【问题描述】:
这主要是关于 Oracle Java 8 JVM。假设我无权访问日志。 Java 没有以详细模式运行,并且没有记录标准输入/标准错误。
在运行的 JVM 中是否有任何地方保存最后一次 GC 事件的时间戳?或者其他任何可能表明上次 GC 事件发生时间的信息?
我只想知道上一次 GC 事件发生在多长时间前。区分不同类型的 GC 事件的奖励积分。
【问题讨论】:
标签:
java
garbage-collection
monitoring
【解决方案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 已经运行管理代理或可通过附加 API 访问它(通常意味着在同一台计算机上运行),则它可以工作,因此可以稍后启动管理代理。这些选项也是 VisualVM 等工具使用的。