I would like to have some long-running server applications periodically output general GC performance numbers in Java, something like the GC equivalent of Runtime.freeMemory
Try -XX:-PrintGC
and -XX:-PrintGCDetails
; see VM Debugging Options.
Slightly off topic but you can hook up VisualVM and JConsole to running applications and see useful stats.
Here's an example using GarbageCollectorMXBean
to print out GC stats. Presumably you would call this method periodically, e.g. scheduling using 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);
}
See GarbageCollectorMXBean.