Senior
How did you take heap dumps, analyze them, and automate the process?
sobes.tech AI
Answer from AI
Heap dump is a snapshot of the JVM heap at a specific moment, which helps analyze memory usage and detect leaks.
How to take a heap dump:
- Using built-in JVM tools, for example,
jmap -dump:live,format=b,file=heapdump.hprof <pid>. - In production, you can trigger a heap dump via JMX or using
jcmd <pid> GC.heap_dump <file>. - Sometimes, heap dumps are created during OutOfMemoryError by configuring the JVM with the
-XX:+HeapDumpOnOutOfMemoryErrorparameter.
How to analyze:
- Opening the heap dump in tools like Eclipse MAT (Memory Analyzer Tool) or VisualVM.
- Looking for suspicious objects that occupy a lot of memory.
- Analyzing object retention paths (dominator tree) to understand why objects are not collected by the garbage collector.
- Using reports on suspicious leaks, such as "Leak Suspects" in MAT.
How to automate the process:
- Configuring the JVM to automatically dump on memory errors.
- Writing monitoring scripts that trigger
jcmdto take a heap dump when a certain memory threshold is reached. - Integrating with monitoring systems (Prometheus, Grafana) to automatically respond to anomalies and collect dumps.
Example command for manually taking a heap dump:
jcmd <pid> GC.heap_dump /path/to/heapdump.hprof
Bash automation example:
#!/bin/bash
THRESHOLD=80 # % memory usage
PID=$(pidof java_app)
USAGE=$(jstat -gc $PID | tail -1 | awk '{print $3+$5}')
if (( $(echo "$USAGE > $THRESHOLD" | bc -l) )); then
jcmd $PID GC.heap_dump /tmp/heapdump_$(date +%s).hprof
fi