我想让一些长期运行的服务器应用程序定期输出Java中的常规GC性能数字,比如相当于Runtime.freeMemory()的GC等等.完成循环次数,平均时间等.
我们有在客户机器上运行的系统,其中怀疑错误配置的内存池导致GC频率和长度过多 - 我发现定期报告基本GC活动会很好.
有没有平台独立的方法来做到这一点?
编辑:我特意想在运行时将此数据输出到系统日志(控制台); 这不是我想要连接到JVM的东西,就像JConsole或JVisualVM一样.
Edit2:MX bean看起来像我想要的 - 有没有人有一个工作代码示例获得其中一个?
这是一个GarbageCollectorMXBean
用于打印GC统计数据的示例.据推测,您可以定期调用此方法,例如使用a调度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
; 请参阅VM调试选项.