Quy trình chẩn đoán:
- Phát hiện: heap usage tăng liên tục qua GC cycle, cuối cùng OutOfMemoryError. Monitor qua Actuator
/metricshoặc Prometheus. - Capture heap dump:
jmap -dump:live,format=b,file=heap.hprof <pid>hoặc-XX:+HeapDumpOnOutOfMemoryError. - Phân tích: Eclipse MAT (Memory Analyzer Tool) — tìm "Leak Suspects" report. YourKit, JProfiler nếu có license. Tìm: retained heap lớn bất thường, static collection grow unbounded, object count tăng.
- Common culprits: static HashMap/List không clear, event listener không deregister, ThreadLocal không remove, connection pool leak, cache không có eviction.
- Java Flight Recorder (JFR): bundled sẵn từ Java 11+ (OpenJDK)
Kích hoạt khi start JVM: -XX:StartFlightRecording=duration=60s,filename=app.jfr, hoặc runtime: jcmd <pid> JFR.start.
Flag -XX:+FlightRecorder là Oracle JDK 8 commercial option, bị ignored trong OpenJDK 11+.
Track allocation rate, thread contention, GC behavior real-time, overhead <2%.
Fix: release resources trong finally/try-with-resources, dùng WeakReference cho cache, review lifecycle annotation (@PreDestroy).