Skip to content

Instantly share code, notes, and snippets.

@TuxCoding
Created December 9, 2016 12:04
Show Gist options
  • Save TuxCoding/403523539c7db1cdf1d1451027fcd1e9 to your computer and use it in GitHub Desktop.
Save TuxCoding/403523539c7db1cdf1d1451027fcd1e9 to your computer and use it in GitHub Desktop.

Revisions

  1. games647 created this gist Dec 9, 2016.
    51 changes: 51 additions & 0 deletions HeapDump.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,51 @@
    import java.io.File;
    import java.lang.management.ManagementFactory;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import javax.management.InstanceNotFoundException;
    import javax.management.MBeanException;
    import javax.management.MBeanServer;
    import javax.management.MalformedObjectNameException;
    import javax.management.ObjectName;
    import javax.management.ReflectionException;

    public class HeapDump {

    //https://docs.oracle.com/javase/8/docs/jre/api/management/extension/com/sun/management/DiagnosticCommandMBean.html
    private static final String DIAGNOSTIC_COMMAND = "com.sun.management:type=DiagnosticCommand";
    private static final String HEAP_COMMAND = "gcClassHistogram";

    //can be useful for dumping heaps in binary format
    //https://docs.oracle.com/javase/8/docs/jre/api/management/extension/com/sun/management/HotSpotDiagnosticMXBean.html
    private static final String HOTSPOT_DIAGNOSTIC = "com.sun.management:type=HotSpotDiagnostic";
    private static final String DUMP_COMMAND = "dumpHeap";
    private static final String DUMP_FILE_NAME = "heap";
    private static final String DUMP_FILE_ENDING = ".hprof";
    private static final boolean DUMP_DEAD_OBJECTS = false;

    private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");

    public static void dumpHeap(String dumpFolder)
    throws MalformedObjectNameException, InstanceNotFoundException, MBeanException, ReflectionException {
    MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
    ObjectName hotspotBean = ObjectName.getInstance(HOTSPOT_DIAGNOSTIC);

    String timeSuffix = '-' + dateFormat.format(new Date());
    File dumpFile = new File(dumpFolder, DUMP_FILE_NAME + timeSuffix + DUMP_FILE_ENDING);
    //it needs to be with a system dependent path seperator
    mBeanServer.invoke(hotspotBean, DUMP_COMMAND
    , new Object[]{dumpFile.getAbsolutePath(), DUMP_DEAD_OBJECTS}
    , new String[]{String.class.getName(), Boolean.TYPE.getName()});
    }

    public static void getHeap()
    throws MalformedObjectNameException, InstanceNotFoundException, MBeanException, ReflectionException {
    ObjectName diagnosticObjectName = ObjectName.getInstance(DIAGNOSTIC_COMMAND);

    MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
    String reply = (String) mBeanServer.invoke(diagnosticObjectName, HEAP_COMMAND
    , new Object[]{new String[]{}}, new String[]{String[].class.getName()});
    System.out.println(reply);
    }
    }