你能用Java获得基本的GC统计吗?
我希望有一些长期运行的服务器应用程序定期输出Java中的一般GC性能数字,例如Runtime.freeMemory()等效的GC等等。类似于完成的循环次数,平均时间等。
我们有系统运行在客户机器上,怀疑configuration不当的内存池导致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); }
请参阅GarbageCollectorMXBean 。
试试-XX:-PrintGC
和-XX:-PrintGCDetails
; 请参阅虚拟机debugging选项 。
稍微偏离主题,但可以将VisualVM和JConsole连接到正在运行的应用程序并查看有用的统计信息。