Eclipse Memory Analyzer Tool (MAT) phiên bản 1.11.0 là công cụ chuyên sâu để điều tra rò rỉ bộ nhớ và tối ưu hóa tiêu thụ heap trong ứng dụng Java, đặc biệt được kiểm chứng kỹ lưỡng trên môi trường Java 8. Dưới đây là hướng dẫn thực hành chi tiết — từ thiết lập ban đầu đến các kỹ thuật phân tích nâng cao — nhằm khai thác tối đa tiềm năng của phiên bản này.
1. Thiết lập môi trường MAT 1.11.0
Tải xuống: Truy cập kho lưu trữ chính thức:
Các gói cài đặt theo hệ điều hành:
- Windows:
MemoryAnalyzer-1.11.0.20201202-win32.win32.x86_64.zip - macOS:
MemoryAnalyzer-1.11.0.20201202-macosx.cocoa.x86_64.dmg - Linux:
MemoryAnalyzer-1.11.0.20201202-linux.gtk.x86_64.tar.gz
Lưu ý: Phần 20201202 trong tên tệp là ngày xây dựng — 02/12/2020.
Cấu hình bộ nhớ (bắt buộc): Giá trị mặc định -Xmx1g không đủ cho file heap lớn. Với file heap.hprof dung lượng 2 GB, nên cấp tối thiểu 4 GB:
-vmargs
-Xmx4g
-Dorg.eclipse.swt.internal.gtk.cairoGraphics=false
-Dfile.encoding=UTF-8
Đặt cấu hình trong tệp MemoryAnalyzer.ini tại thư mục cài đặt.
2. Mở và xử lý file heap dump
Sau khi khởi chạy MemoryAnalyzer.exe hoặc MemoryAnalyzer, chọn:
- File → Open Heap Dump
- Chọn file
.hprof(hoặc.jfrnếu có) - MAT sẽ tự động tạo chỉ mục
.index— thời gian phụ thuộc vào kích thước và cấu hình RAM
Nếu xuất hiện cảnh báo "Out of memory", hãy quay lại chỉnh -Xmx tăng thêm.
3. Các chế độ phân tích trọng tâm
🔹 Báo cáo nghi vấn rò rỉ (Leak Suspects Report)
Khi mở file thành công, MAT tự động hiển thị báo cáo này — điểm khởi đầu cho mọi cuộc điều tra:
- Liệt kê các đối tượng chiếm nhiều bộ nhớ nhất
- Hiển thị chuỗi tham chiếu ngắn nhất tới GC Roots
- Trích đoạn cây支配 (Dominator Tree) liên quan
Ví dụ: "One instance of com.example.DataBuffer retains 1.8 GB" → kiểm tra đường dẫn như static com.example.Service.bufferPool → DataBuffer.
🔹 Biểu đồ phân bố lớp (Histogram)
Truy cập qua Window → Histogram. Đây là nơi xác định nhanh lớp nào tạo ra quá nhiều thể hiện:
- Sắp xếp theo cột Retained Heap hoặc Objects để phát hiện bất thường
- Click chuột phải lên lớp (ví dụ
char[]) → Merge Shortest Paths to GC Roots → chọn exclude weak/soft references - Click phải → List Objects → with incoming references để xem đối tượng nào đang giữ tham chiếu mạnh
🔹 Cây支配 (Dominator Tree)
Truy cập qua Window → Dominator Tree. Khác với Histogram, cây này sắp xếp theo Retained Heap — tổng dung lượng giải phóng nếu loại bỏ đối tượng đó và toàn bộ con cháu nó:
- Sắp xếp giảm dần theo Retained Heap
- Chọn top 5 dòng đầu
- Click phải → Path To GC Roots → exclude all but strong refs
- Theo dõi chuỗi tham chiếu để xác định vị trí mã nguồn gây giữ reference vô hạn
🔹 Ngôn ngữ truy vấn đối tượng (OQL)
Mở qua Window → OQL Console. Cú pháp tương tự SQL, hỗ trợ truy vấn linh hoạt:
-- Lấy tất cả thể hiện của lớp OrderProcessor
SELECT * FROM com.acme.processing.OrderProcessor
-- Tìm các HashMap có số phần tử vượt ngưỡng
SELECT * FROM java.util.HashMap h WHERE h.size > 5000
-- Đếm số lượng đối tượng trong package con
SELECT count(*) FROM "com.acme.cache.*"
-- Lấy giá trị trường 'status' của các đối tượng Job
SELECT j.status.@value FROM com.acme.job.Job j
Biểu thức @value truy cập dữ liệu nội tại của trường (ví dụ giá trị thực của String).
4. Trường hợp thực tế: Phát hiện cache không giải phóng
- Ghi heap dump:
jmap -dump:live,format=b,file=app-heap.hprof 12345 - Mở file trong MAT
- Xem Leak Suspects Report → nhận diện
ConcurrentHashMapchiếm 92% heap - Mở Histogram → tìm lớp
ConcurrentHashMap→ click phải → Merge Shortest Paths to GC Roots - Kết quả:
static com.acme.cache.GlobalCache.instance → map→ xác minh mã nguồn thiếu cơ chế xóa cũ hoặc TTL
5. Tính năng nổi bật của MAT 1.11.0
| Tính năng | Mô tả |
|---|---|
| Hỗ trợ phân tích Metaspace | Phát hiện rò rỉ ClassLoader và class definition trong Java 8+ |
| Phân tích ngăn xếp luồng | Hiển thị đối tượng được giữ bởi từng thread trong Thread Overview |
| So sánh hai heap dump | Dùng Compare Baselines để so sánh sự thay đổi về đối tượng giữa hai thời điểm |
| Mở rộng qua plugin | Hỗ trợ cài đặt plugin tùy chỉnh (ví dụ: hỗ trợ phân tích Android heap) |
6. Xử lý sự cố thường gặp
- Lỗi exit code=13: Dùng JDK 64-bit nếu dùng MAT 64-bit (không hỗ trợ JDK 32-bit)
- Ứng dụng treo khi mở file lớn: Tăng
-Xmx, tắt ứng dụng nền, ưu tiên chạy trên Linux server - Hiển thị ký tự Unicode sai: Thêm dòng
-Dfile.encoding=UTF-8vàoMemoryAnalyzer.ini
7. Tài nguyên học tập
- Tài liệu chính thức MAT 1.11: https://help.eclipse.org/2020-12/...
- Case study từ nhóm phát triển: https://www.eclipse.org/mat/
- Sách tham khảo: Java Performance Companion, Chương 4 – Phân tích bộ nhớ