Thông thường, những gì tôi sử dụng được ParseHeapDump.sh
bao gồm trong Trình phân tích bộ nhớ Eclipse và được mô tả ở đây , và tôi thực hiện điều đó trên một máy chủ tăng cường hơn của chúng tôi (tải xuống và sao chép qua bản phân phối .zip linux, giải nén ở đó). Tập lệnh shell cần ít tài nguyên hơn so với phân tích cú pháp heap từ GUI, ngoài ra bạn có thể chạy nó trên máy chủ mạnh mẽ của mình với nhiều tài nguyên hơn (bạn có thể phân bổ nhiều tài nguyên hơn bằng cách thêm thứ gì đó giống như -vmargs -Xmx40g -XX:-UseGCOverheadLimit
vào cuối dòng cuối cùng của tập lệnh. Ví dụ: dòng cuối cùng của tệp đó có thể trông như thế này sau khi sửa đổi
./MemoryAnalyzer -consolelog -application org.eclipse.mat.api.parse "$@" -vmargs -Xmx40g -XX:-UseGCOverheadLimit
Chạy nó như ./path/to/ParseHeapDump.sh ../today_heap_dump/jvm.hprof
Sau khi thành công, nó tạo ra một số tệp "chỉ mục" bên cạnh tệp .hprof.
Sau khi tạo các chỉ số, tôi cố gắng tạo các báo cáo từ đó và quét các báo cáo đó đến các máy cục bộ của mình và thử xem liệu tôi có thể tìm ra thủ phạm chỉ bằng cách đó không (không chỉ báo cáo, không phải chỉ số). Đây là hướng dẫn về cách tạo báo cáo .
Báo cáo mẫu:
./ParseHeapDump.sh ../today_heap_dump/jvm.hprof org.eclipse.mat.api:suspects
Các tùy chọn báo cáo khác:
org.eclipse.mat.api:overview
và org.eclipse.mat.api:top_components
Nếu những báo cáo đó không đủ và nếu tôi cần đào thêm (tức là hãy nói qua oql), tôi quét các chỉ mục cũng như tệp hprof vào máy cục bộ của mình và sau đó mở kết xuất heap (với các chỉ số trong cùng một thư mục như kết xuất đống) với Eclipse MAT GUI của tôi. Từ đó, nó không cần quá nhiều bộ nhớ để chạy.
CHỈNH SỬA:
Tôi chỉ muốn thêm hai ghi chú:
- Theo như tôi biết, chỉ có phần tạo ra các chỉ số là phần bộ nhớ chuyên sâu của Eclipse MAT. Sau khi bạn có các chỉ mục, hầu hết quá trình xử lý của bạn từ Eclipse MAT sẽ không cần nhiều bộ nhớ như vậy.
- Làm điều này trên một tập lệnh shell có nghĩa là tôi có thể thực hiện nó trên một máy chủ không đầu (và tôi cũng thường làm điều đó trên một máy chủ không đầu, vì chúng thường là những máy chủ mạnh nhất). Và nếu bạn có một máy chủ có thể tạo ra một kết xuất heap với kích thước đó, rất có thể, bạn có một máy chủ khác cũng có thể xử lý nhiều như vậy về kết xuất heap.
ArrayIndexOutOfBoundsException
tính năng trong ít nhất hai lỗi . Tôi nói rõ điều này vì bạn đã không báo cáo OOME khi chạy MAT, có một bản sửa lỗi khác .