The built-in way to get a heap dump is via the
jmap utility. It’s part of the
openjdk-devel package on CentOS.
If you’re working with java 8, you’re probably using the
package, in which case you’ll want
Be careful not to install the
-devel-debug package, as that contains
debuggable binaries and is therefore much slower.
The basic format for creating a heap dump is:
jmap -dump:format=b,file=/tmp/dump.hprof <PID>
However, there’s a few details and error messages to be aware of:
Jmap should run be under the same user and group as the target JVM
This can be circumvented using the
-F force flag, but results in a heap dumps
taking a very long time to capture. See this stackoverflow answer for the
To find the user/group required, check
/tmp/hsperfdata_$USER/$PID for the
If running under the wrong group user/group, you may see a “well-known file is not secure” error.
For example, if the JVM’s running under the user/group
su -g tomcat -c 'jmap -dump:format=b,file=heap.hprof <PID>' tomcat
The debuginfo package may be required
java.lang.InternalError: Metadata does not appear to be polymorphic
This unusually interesting error means you need the
For CentOS, it’s in a separate repository as described here: https://wiki.centos.org/AdditionalResources/Repositories.