English 中文(简体)
你能用Java获取基本的GC统计信息吗?
原标题:
  • 时间:2009-01-21 20:38:41
  •  标签:

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

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

有没有任何平台独立的方法来做这个?

编辑:我特意想将这些数据输出到系统日志(控制台)中,在运行时; 这不是我想连接到JVM进行的操作,而是像JConsole或JVisualVM那样。

编辑2:MX bean看起来像我想要的东西-有人有一个获得其中一个的工作代码示例吗?

最佳回答

这是使用 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);
}
问题回答

JVM 已经内置了一定数量的垃圾回收器日志记录,因此根据您的要求,您可能不需要自定义解决方案。

在Java 7中,您可以使用-XX:-PrintGC-XX:-PrintGCDetails;请参见 VM调试选项

在Java 8至10中,使用-XX:+PrintGC-XX:+PrintGCDetails而不是-,使用+来源)。

在Java 11或更高版本中,-XX选项已被弃用,取而代之的是-Xlog:gc。有关更高级选项,请参见“使用JVM统一日志框架启用日志记录”。

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





相关问题
热门标签