监视Java垃圾收集时的CPU,RAM,I / O使用情况

我正在使用-Xloggc将GC消息输出到文件。 不过,我也有兴趣了解GC事件发生时CPU,内存,I / O等系统参数。 我知道sar linux命令在那里,但是我如何知道GC事件发生时的指标,而不是使用时间戳手动比较结果。

Java 1.7
Oracle企业版Linux 2.6.39

谢谢。

Solutions Collecting From Web of "监视Java垃圾收集时的CPU,RAM,I / O使用情况"

如果你使用Java 1.7 update 4,你可以注册一个GarbageCollectorMXBean 。

下面是一个设置的例子 ,包括关于内存的排放(你也可以用MX类获得更多的系统参数):

 public static void installGCMonitoring(){ //get all the GarbageCollectorMXBeans - there's one for each heap generation //so probably two - the old generation and young generation List<GarbageCollectorMXBean> gcbeans = java.lang.management.ManagementFactory.getGarbageCollectorMXBeans(); //Install a notifcation handler for each bean for (GarbageCollectorMXBean gcbean : gcbeans) { System.out.println(gcbean); NotificationEmitter emitter = (NotificationEmitter) gcbean; //use an anonymously generated listener for this example // - proper code should really use a named class Notificationlistner listener = new Notificationlistner() { //keep a count of the total time spent in GCs long totalGcDuration = 0; //implement the notifier callback handler @Override public void handleNotification(Notification notification, Object handback) { //we only handle GARBAGE_COLLECTION_NOTIFICATION notifications here if (notification.getType().equals(GarbageCollectionNotificationInfo.GARBAGE_COLLECTION_NOTIFICATION)) { //get the information associated with this notification GarbageCollectionNotificationInfo info = GarbageCollectionNotificationInfo.from((CompositeData) notification.getUserData()); //get all the info and pretty print it long duration = info.getGcInfo().getDuration(); String gctype = info.getGcAction(); if ("end of minor GC".equals(gctype)) { gctype = "Young Gen GC"; } else if ("end of major GC".equals(gctype)) { gctype = "Old Gen GC"; } System.out.println(); System.out.println(gctype + ": - " + info.getGcInfo().getId()+ " " + info.getGcName() + " (from " + info.getGcCause()+") "+duration + " microseconds; start-end times " + info.getGcInfo().getStartTime()+ "-" + info.getGcInfo().getEndTime()); //System.out.println("GcInfo CompositeType: " + info.getGcInfo().getCompositeType()); //System.out.println("GcInfo MemoryUsageAfterGc: " + info.getGcInfo().getMemoryUsageAfterGc()); //System.out.println("GcInfo MemoryUsageBeforeGc: " + info.getGcInfo().getMemoryUsageBeforeGc()); //Get the information about each memory space, and pretty print it Map<String, MemoryUsage> membefore = info.getGcInfo().getMemoryUsageBeforeGc(); Map<String, MemoryUsage> mem = info.getGcInfo().getMemoryUsageAfterGc(); for (Entry<String, MemoryUsage> entry : mem.entrySet()) { String name = entry.getKey(); MemoryUsage memdetail = entry.getValue(); long memInit = memdetail.getInit(); long memCommitted = memdetail.getCommitted(); long memMax = memdetail.getMax(); long memUsed = memdetail.getUsed(); MemoryUsage before = membefore.get(name); long beforepercent = ((before.getUsed()*1000L)/before.getCommitted()); long percent = ((memUsed*1000L)/before.getCommitted()); //>100% when it gets expanded System.out.print(name + (memCommitted==memMax?"(fully expanded)":"(still expandable)") +"used: "+(beforepercent/10)+"."+(beforepercent%10)+"%->"+(percent/10)+"."+(percent%10)+"%("+((memUsed/1048576)+1)+"MB) / "); } System.out.println(); totalGcDuration += info.getGcInfo().getDuration(); long percent = totalGcDuration*1000L/info.getGcInfo().getEndTime(); System.out.println("GC cumulated overhead "+(percent/10)+"."+(percent%10)+"%"); } } }; //Add the listener emitter.addNotificationlistner(listener, null, null); } } 

您可以使用Tracer插件尝试VisualVM 。 一些截图展示了它的样子