【问题标题】: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 等工具使用的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 2021-12-26
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 2011-07-16
      相关资源
      最近更新 更多