代码之家  ›  专栏  ›  技术社区  ›  L. Cornelius Dol

你能用Java获得基本的GC统计数据吗?

  •  39
  • L. Cornelius Dol  · 技术社区  · 17 年前

    我想让一些长时间运行的服务器应用程序周期性地输出Java中的一般GC性能数字,类似于Runtime.freeMemory()的GC等价物,等等。类似于完成的周期数、平均时间等。

    我们有一些运行在客户机器上的系统,怀疑配置错误的内存池会导致GC频率和长度过大——我认为,通常最好定期报告基本GC活动。

    有没有平台无关的方法可以做到这一点?

    编辑:我特别想在运行时将此数据输出到系统日志(控制台);这不是我想要连接到JVM的东西,就像JConsole或JVisualVM一样。

    4 回复  |  直到 17 年前
        1
  •  55
  •   Greg Case    17 年前

    GarbageCollectorMXBean 打印GC统计数据。您可能会定期调用此方法,例如使用 ScheduledExecutorService .

    public void printGCStats() {
        long totalGarbageCollections = 0;
        long garbageCollectionTime = 0;
    
        for(GarbageCollectorMXBean gc :
                ManagementFactory.getGarbageCollectorMXBeans()) {
    
            long count = gc.getCollectionCount();
    
            if(count >= 0) {
                totalGarbageCollections += count;
            }
    
            long time = gc.getCollectionTime();
    
            if(time >= 0) {
                garbageCollectionTime += time;
            }
        }
    
        System.out.println("Total Garbage Collections: "
            + totalGarbageCollections);
        System.out.println("Total Garbage Collection Time (ms): "
            + garbageCollectionTime);
    }
    
        2
  •  15
  •   Ran Biron    17 年前
        3
  •  12
  •   Michael Myers KitsuneYMG    4 年前

    在Java7中,您可以使用 -XX:-PrintGC -XX:-PrintGCDetails VM Debugging Options .

    在Java8到Java10中,使用 -XX:+PrintGC -XX:+PrintGCDetails 用一个 + 而不是 - ( source ).

    have been deprecated 赞成 -Xlog:gc . 看见 Enabling Logging with the JVM Unified Logging Framework 更多高级选项。

        4
  •  0
  •   Fortyrunner    17 年前