HPROF Binary Heap Dumps
Get Heap Dump on an OutOfMemoryError
One can get a HPROF binary heap dump on an OutOfMemoryError for Sun JVM (1.4.2_12 or higher and 1.5.0_07 or higher), Oracle JVMs, OpenJDK JVMs, HP-UX JVM (1.4.2_11 or higher) and SAP JVM (since 1.5.0) by setting the following JVM parameter:
-XX:+HeapDumpOnOutOfMemoryError
By default, the heap dump is written to the work directory. This can be controlled using the following option to specify a directory or file name. -XX:HeapDumpPath=/dumpPath/ -XX:HeapDumpPath=./java_pidPIDNNN.hprof
Interactively Trigger a Heap Dump
To get heap dump on demand one can add the following parameter to the JVM and press CTRL + BREAK in the preferred moment:
-XX:+HeapDumpOnCtrlBreak
This is only available between Java 1.4.2 and Java 6.
HPROF agent
To use the HPROF agent to generate a dump on the end of execution, or on SIGQUIT signal use the following JVM parameter:
-agentlib:hprof=heap=dump,format=b
This was removed in Java 9 and later.
Alternatively, other tools can be used to acquire a heap dump:
System Dumps and Heap Dumps from IBM Virtual Machines
Dump Format | Approximate size on disk | Objects, classes, and classloaders | Thread details | Field names | Field and array references | Primitive field contents | Primitive array contents | Accurate garbage-collection roots | Native memory and threads | Compression |
---|---|---|---|---|---|---|---|---|---|---|
HPROF | Java heap size | Y | Y | Y | Y | Y | Y | Y | N | with Gzip to around 40 percent of original size |
IBM system dumps | Java heap size + 30 percent | Y | Y | Y | Y | Y | Y | Y | Y | with Zip or jextract to around 20 percent of original size |
IBM PHD | 20 percent of Java heap size | Y | with Javacore2 | N | Y | N | N | N | N | with Gzip to around 20 percent of original size |
Older versions of IBM Java (e.g. < 5.0SR12, < 6.0SR9) require running jextract on the operating system core dump which produced a zip file that contained the core dump, XML or SDFF file, and shared libraries. The IBM DTFJ feature still supports reading these jextracted zips although IBM DTFJ feature version 1.12.29003.201808011034 and later cannot read IBM Java 1.4.2 SDFF files, so MAT cannot read them either. Dumps from newer versions of IBM Java do not require jextract for use in MAT since DTFJ is able to directly read each supported operating system's core dump format. Simply ensure that the operating system core dump file ends with the .dmp suffix for visibility in the MAT Open Heap Dump selection. It is also common to zip core dumps because they are so large and compress very well. If a core dump is compressed with .zip, the IBM DTFJ feature in MAT is able to decompress the ZIP file and read the core from inside (just like a jextracted zip). The only significant downsides to system dumps over PHDs is that they are much larger, they usually take longer to produce, they may be useless if they are manually taken in the middle of an exclusive event that manipulates the underlying Java heap such as a garbage collection, and they sometimes require operating system configuration ( Linux, AIX) to ensure non-truncation.
In recent versions of IBM Java (> 6.0.1), by default, when an OutOfMemoryError is thrown, IBM Java produces a system dump, PHD, javacore, and Snap file on the first occurrence for that process (although often the core dump is suppressed by the default 0 core ulimit on operating systems such as Linux). For the next three occurrences, it produces only a PHD, javacore, and Snap. If you only plan to use system dumps, and you've configured your operating system correctly as per the links above (particularly core and file ulimits), then you may disable PHD generation with -Xdump:heap:none. For versions of IBM Java older than 6.0.1, you may switch from PHDs to system dumps using -Xdump:system:events=systhrow,filter=java/lang/OutOfMemoryError,request=exclusive+prepwalk -Xdump:heap:none
In addition to an OutOfMemoryError, system dumps may be produced using operating system tools (e.g. gcore in gdb for Linux, gencore for AIX, Task Manager for Windows, SVCDUMP for z/OS, etc.), using the IBM and OpenJ9 Java APIs, using the various options of -Xdump, using Java Surgery, and more.
Versions of IBM Java older than IBM JDK 1.4.2 SR12, 5.0 SR8a and 6.0 SR2 are known to produce inaccurate GC root information.
Acquire Heap Dump from Memory Analyzer
If the Java process from which the heap dump is to be acquired is on the same machine as the Memory Analyzer, it is possible to acquire a heap dump directly from the Memory Analyzer. Dumps acquired this way are directly parsed and opened in the tool.
Acquiring the heap dump is VM specific. Memory Analyzer comes with several so called heap dump providers - for OpenJDK, Oracle and Sun based VMs (needs a OpenJDK, Oracle or Sun JDK with jmap) and for IBM VMs (needs an IBM JDK or JRE). Also extension points are provided for adopters to plug-in their own heap dump providers.
To trigger a heap dump from Memory Analyzer open the Acquire Heap Dump now.
menu item. TryDepending on the concrete execution environment the pre-installed heap dump providers may work with their default settings and in this case a list of running Java processes should appear: To make selection easier, the order of the Java processes can be altered by clicking on the column titles for pid or Heap Dump Provider.
One can now select from which process a heap dump should be acquired, provide a preferred location for the heap dump and press Finish to acquire the dump. Some of the heap dump providers may allow (or require) additional parameters (e.g. type of the heap dump) to be set. This can be done by using button to get to the Heap Dump Provider Arguments page of the wizard.
Configuring the Heap Dump Providers
If the process list is empty try to configure the available heap dump providers. To do this press Configure... , select a matching provider from the list and click on it. You can see then what are the required settings and specify them. will then apply any changed settings, and refresh the JVM list if any settings have been changed. will return to the current JVM list without applying any changed settings. To then apply the changed settings reenter and exit the Configure Heap Dump Providers... page as follows:
If a process is selected before pressing Configure... then the corresponding dump provider will be selected on entering the Configure Heap Dump Providers... page.
If a path to a jcmd executable is provided then this command will be used to generate a list of running JVMs and to generate the dumps.
Options
System dumps can be processed using jextract which compressed the dump and also adds extra system information so that the dump could be moved to another machine.
Portable Heap Dump (PHD) files generated with the Heap option can be compressed using the gzip compressor to reduce the file size.
HPROF files can be compressed using the Gzip compressor to reduce the file size. A compressed file may take longer to parse in Memory Analyzer, and running queries and reports and reading fields from objects may take longer.
Multiple snapshots in one heap dump
-agentlib:hprof=heap=dump,format=b
then if a heap dump is triggered multiple times all the heap dumps will be written to one file.
An IBM z/OS system dump can contain data from multiple address spaces and processes.
It is therefore possible that the dump file contains heap dump snapshots from multiple Java runtimes.
Memory Analyzer 1.2 and earlier handled this situation by choosing the first heap dump snapshot found unless another was selected via an environment variable or MAT DTFJ configuration option.
Memory Analyzer 1.3 handles this situation by detecting the multiple dumps, then presenting a dialog for the user to select the required snapshot.
The index files generated have a component in the file name from the snapshot identifier, so the index files from each snapshot can be distinguished. This means that multiple snapshots from one heap dump file can be examined in Memory Analyzer simultaneously. The heap dump history for the file remembers the last snapshot selected for that file, though when the snapshot is reopened via the history the index file is also shown in the history. To open another snapshot in the dump, close the first snapshot, then reopen the heap dump file using the File menu and another snapshot can be chosen to be parsed. The first snapshot can then be reopened using the index file in the history, and both snapshots can be viewed at once.
Summary
The following table shows the availability of VM options and tools on the various platforms:
Vendor | Release | VM Parameter | JVM Tools | SAP Tool | Attach | MAT | ||||
---|---|---|---|---|---|---|---|---|---|---|
On out of memory | On Ctrl+Break | Agent | JMap | JCmd | JConsole | JVMMon | API | acquire heap dump | ||
Sun, HP | 1.4.2_12 | Yes | Yes | Yes | No | No | No | No | No | |
1.5.0_07 | Yes | Yes (Since 1.5.0_15) | Yes | Yes (Only Solaris and Linux) | No | No | No | com.sun.tools.attach | Yes (Only Solaris and Linux) | |
1.6.0_00 | Yes | No | Yes | Yes | No | Yes | No | com.sun.tools.attach | Yes | |
Oracle, OpenJDK, HP | 1.7.0 | Yes | No | Yes | Yes | Yes | Yes | com.sun.tools.attach | Yes | |
Oracle, OpenJDK, Eclipse Temurin, HP, Amazon Corretto | 1.8.0 | Yes | No | Yes | Yes | Yes | Yes | com.sun.tools.attach | Yes | |
11 | Yes | No | No | Yes | Yes | Yes | com.sun.tools.attach | Yes | ||
17 | Yes | No | No | Yes | Yes | Yes | com.sun.tools.attach | Yes | ||
21 | Yes | No | No | Yes | Yes | Yes | com.sun.tools.attach | Yes | ||
SAP | Any 1.5.0 | Yes | Yes | Yes | Yes (Only Solaris and Linux) | No | No | Yes | ||
IBM | 1.4.2 SR12 | Yes | Yes | No | No | No | No | No | No | |
1.5.0 SR8a | Yes | Yes | No | No | No | No | No | com.ibm.tools.attach | No | |
1.6.0 SR2 | Yes | Yes | No | No | No | No | No | com.ibm.tools.attach | No | |
1.6.0 SR6 | Yes | Yes | No | No | No | No | No | com.ibm.tools.attach | Yes | |
1.7.0 | Yes | Yes | No | No | No | No | No | com.ibm.tools.attach | Yes | |
1.8.0 | Yes | Yes | No | No | No | No | No | com.ibm.tools.attach | Yes | |
1.8.0 SR5 | Yes | Yes | No | No | No | Yes (PHD only?) | No | com.sun.tools.attach | Yes | |
OpenJ9, IBM Semeru | 1.8.0 | Yes | Yes | No | No | Yes | Yes (PHD only) | No | com.sun.tools.attach | Yes |
11 | Yes | Yes | No | No | Yes | Yes | No | com.sun.tools.attach | Yes | |
17 | Yes | Yes | No | No | Yes | Yes | No | com.sun.tools.attach | Yes |