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

时间:2009-01-21 20:38:41

标签: java garbage-collection

我想让一些长期运行的服务器应用程序定期输出Java中的常规GC性能数字,类似于等效于Runtime.freeMemory()的GC等等。完成循环次数,平均时间等等。 / p>

我们在客户机器上运行系统,怀疑错误配置的内存池导致过多的GC频率和长度 - 我发现定期报告基本GC活动会很好。

有没有独立于平台的方法呢?

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

Edit2:MX bean看起来像我想要的 - 有没有人有一个可以获得其中一个的工作代码示例?

4 个答案:

答案 0 :(得分:51)

以下是使用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);
}

答案 1 :(得分:15)

答案 2 :(得分:13)

尝试-XX:-PrintGC-XX:-PrintGCDetails;见VM Debugging Options

答案 3 :(得分:0)

稍微偏离主题,但您可以将VisualVM和JConsole连接到正在运行的应用程序并查看有用的统计信息。