package railo.commons.surveillance; import java.io.IOException; import java.lang.management.ManagementFactory; import javax.management.MBeanServer; import railo.commons.io.SystemUtil; import railo.commons.io.res.Resource; import railo.commons.io.res.type.file.FileResource; import com.sun.management.HotSpotDiagnosticMXBean; public class HeapDumper { /** * Dumps the heap to the outputFile file in the same format as the hprof heap dump. * If this method is called remotely from another process, the heap dump output is written to a file named outputFile on the machine where the target VM is running. If outputFile is a relative path, it is relative to the working directory where the target VM was started. * @param res Resource to write the .hprof file. * @param live if true dump only live objects i.e. objects that are reachable from others * @throws IOException */ public static void dumpTo(Resource res, boolean live) throws IOException { MBeanServer mbserver = ManagementFactory.getPlatformMBeanServer(); HotSpotDiagnosticMXBean mxbean = ManagementFactory.newPlatformMXBeanProxy( mbserver, "com.sun.management:type=HotSpotDiagnostic", HotSpotDiagnosticMXBean.class ); String path; Resource tmp=null; if(res instanceof FileResource) path=res.getAbsolutePath(); else { tmp=SystemUtil.getTempFile("hprof",false); path=tmp.getAbsolutePath(); } try{ // it only mxbean.dumpHeap(path, live); } finally{ if(tmp!=null && tmp.exists()){ tmp.moveTo(res); } } } }