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

2022-09-01 01:27:02

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

我们有在客户计算机上运行的系统,其中怀疑配置错误的内存池会导致GC频率和长度过长 - 在我看来,通常定期报告基本的GC活动是件好事。

有没有平台独立的方式来做到这一点?

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

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


答案 1

下面是一个用于打印 GC 统计信息的示例。据推测,您会定期调用此方法,例如,使用 .GarbageCollectorMXBeanScheduledExecutorService

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

请参阅 GarbageCollectorMXBean