Heap dump trong Java

Đối với các bạn làm backend thì rất có thể sẽ gặp tình huống là khi ứng dụng Java của chúng ta chạy một thời gian, nó sẽ ngốn rất nhiều RAM và càng chạy lâu  thì ngốn càng nhiều hay thậm chí là bị lỗi OutOfMemory. Đến lúc này, việc chúng ta cần làm đó là điều tra nguyên nhân. Để làm được điều này chúng ta cần xem được tại các thời điểm trên, các object nào là nhiều nhất và tốn nhiều bộ nhớ nhất. Java có hỗ trợ chúng ta việc này bằng cách tạo file heap dump. Do đó:

Heap dump là file ghi lại toàn bộ các object của chương trình được tạo ra khi chương trình đang chạy tại một thời điểm.

Có 2 cách để tạo file heap dump:

1. Tự động tạo file heap dump khi chương trình bị OutOfMemory

Chúng ta chỉ cần truyền vào tham số cho JVM:

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<path to this heap dump file>

Nếu chương trình của bạn bị lỗi OutOfMemory, bạn có thể sử dụng cách này để tạo file heap dump. Tuy nhiên, cách này không được khuyến khích, vì chúng ta cần phải chủ động phân tích bộ nhớ trước khi để xảy ra lỗi bằng cách:

2. Tạo file heap dump manual

Đầu tiên các bạn cần xác định pid của ứng dụng bằng cách sử dụng cmd:

ps -ef | grep “app_name”

Sau khi có được pid của ứng dụng thì bạn chỉ việc chạy lện dump của jmap

jmap -dump:live,file=path/name. pid

Ở lệnh trên mình đã lấy được pid của chương trình pkg999c3443

Đến lúc này, chúng ta chỉ việc sử dụng VisualVM để load file dump vừa được tạo và xem thống kê các object được tạo của chương trình tạo thời điểm tạo file dump.

Hình ảnh về các object của ứng dụng pkg999

Tham khảo thêm:

https://dzone.com/articles/memory-analysis-how-to-obtain-java-heat-dump
https://www.ibm.com/support/knowledgecenter/SS3KLZ/com.ibm.java.diagnostics.memory.analyzer.doc/heapdump.html
https://www.javaworld.com/article/2072864/heap-dump-and-analysis-with-visualvm.html

 

Tham gia bình luận