VisualVM là công cụ quan trọng trong bộ công cụ của lập trình viên Java, đặc biệt khi cần chẩn đoán vấn đề về hiệu năng và bộ nhớ. Bài viết này sẽ hướng dẫn chi tiết cách cài đặt, cấu hình và sử dụng các tính năng chính của VisualVM.
- Tổng Quan Về VisualVM
VisualVM là một công cụ phân tích và giám sát hiệu năng Java được phát triển bởi Oracle. Công cụ này cung cấp các khả năng sau:
- Theo dõi thời thực CPU, bộ nhớ heap, threads và số lượng class đã load
- Tạo và phân tích heap dump để phát hiện memory leak
- Thực hiện sampling CPU và memory để xác định bottleneck
- Phát hiện deadlock và theo dõi trạng thái thread
- Hỗ trợ mở rộng qua plugins
Ưu điểm: Nhẹ, giao diện trực quan, có sẵn trong JDK cũ Nhược điểm: Không được bundle mặc định trong JDK 11+, hạn chế khi phân tích heap dump lớn
- Cài Đặt VisualVM
JDK 8 đến JDK 10
Nếu bạn đang sử dụng các phiên bản JDK này, VisualVM đã được tích hợp sẵn. Truy cập đường dẫn sau trong thư mục JDK:
$JAVA_HOME/bin/jvisualvm
Chạy lệnh này trong terminal để khởi động công cụ.
JDK 11 Trở Lên
Từ JDK 11, Oracle đã loại bỏ VisualVM khỏi bộ cài đặt JDK. Bạn cần tải phiên bản standalone từ trang chính thức.
Đường dẫn tải xuống: https://visualvm.github.io/download.html
Chọn phiên bản phù hợp với hệ điều hành:
- Windows:
visualvm_217.zip - macOS:
VisualVM 2.1.7.dmg - Linux:
visualvm_217.tar.gz
Phiên bản ổn định hiện tại là VisualVM 2.1.7 (phát hành 2024).
Quy Trình Cài Đặt
Trên Windows và Linux:
- Giải nén file đã tải vào thư mục mong muốn
- Chạy file thực thi:
- Windows:
bin/visualvm.exe - Linux:
./bin/visualvm
Trên macOS:
-
Mở file .dmg đã tải
-
Kéo
VisualVM.appvào thư mục Applications -
Cho phép ứng dụng chạy trong System Settings → Privacy & Security
-
Cấu Hình Ban Đầu
Tăng Bộ Nhớ Heap
Khi cần phân tích các heap dump có kích thước lớn, bạn nên tăng bộ nhớ cấp phát cho VisualVM.
Chỉnh sửa file cấu hình:
- Windows:
etc/visualvm.conf - Linux/macOS:
etc/visualvm.conf
Tìm và sửa dòng sau:
# default -J-Xmx256m
visualvm_default_options="-J-Xmx2g"
Khi phân tích heap dump 2GB, nên cấp hình -J-Xmx3g.
Cài Đặt Plugins
Mở VisualVM, vào menu Tools → Plugins để cài đặt các tiện ích mở rộng:
- Visual GC: Hiển thị chi tiết các thế hệ GC (yêu cầu thêm tham số
-XX:+UnlockCommercialFeatures) - Buffer Pools: Giám sát Direct Memory
- MBeans: Truy cập JMX MBean
- Kill Application: Cho phép kết thúc process từ xa
Sau khi cài plugins, cần khởi động lại VisualVM.
- Các Tính Năng Chính
4.1 Giám Sát Ứng Dụng Local
Sau khi khởi động VisualVM, panel Applications bên trái sẽ hiển thị tất cả các process Java đang chạy trên máy. Click vào process bất kỳ để xem thông tin:
- Overview: Phiên bản JDK, tham số khởi động, main class
- Monitor: CPU, heap memory, số class loaded, số thread theo thời gian thực
- Threads: Trạng thái các thread (RUNNABLE/BLOCKED/WAITING), phát hiện deadlock
- Sampler: Sampling CPU và memory
4.2 Phân Tích Heap Dump
Các bước tạo heap dump:
- Trong tab Monitor, click nút Heap Dump
- Chờ vài giây để quá trình hoàn tất (sẽ có briefly pause)
- File
.hprofsẽ xuất hiện trong panel Applications - Double-click để mở và xem:
- Summary: Tổng số instance, kích thước heap
- Classes: Thống kê theo class, số lượng object và bộ nhớ sử dụng
- Instances: Xem chi tiết từng object của class được chọn
- OQL Console: Truy vấn object bằng OQL
Lưu ý: Khả năng phân tích heap dump của VisualVM khá hạn chế. Với các heap dump lớn (trên 2GB), nên export và sử dụng Eclipse MAT để phân tích chuyên sâu hơn.
4.3 Sampling CPU Và Memory
Sampling CPU: Vào tab Sampler, click CPU để bắt đầu. Công cụ sẽ hiển thị thời gian thực thi của các phương thức cùng số lần được gọi. Đây là cách hiệu quả để xác định các phương thức gây tốn nhiều CPU.
Sampling Memory: Click Memory để theo dõi tốc độ cấp phát object. Công cụ hiển thị các object được tạo thường xuyên, ví dụ như các temporary string trong vòng lặp.
So sánh:
- Sampler: Overhead thấp, phù hợp với môi trường production
- Profiler: Độ chính xác cao hơn nhưng overhead lớn, chỉ nên dùng trong môi trường test
4.4 Kết Nối Ứng Dụng Từ Xa
Phương thức 1: Qua JMX
Bước 1: Kích hoạt JMX trên ứng dụng target Thêm các tham số khi khởi động Java:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9090
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=IP_MAY_CHU
Lưu ý: Trong môi trường production, nên bật authentication (authenticate=true) và SSL.
Bước 2: Cấu hình VisualVM
- Chuột phải vào Remote → Add Remote Host
- Nhập địa chỉ IP của server
- Chuột phải vào host vừa thêm → Add JMX Connection
- Nhập port (9090), chọn Do not require SSL
- Click OK để kết nối
4.5 Phân Tích Thread Và Phát Hiện Deadlock
Vào tab Threads và click Thread Dump để lấy snapshot hiện tại của tất cả threads. Nếu có deadlock, VisualVM sẽ hiển thị thông báo "Deadlock detected!" và highlight các threads liên quan. Bạn có thể xem stack trace và thông tin về các locks mà mỗi thread đang giữ.
- Mẹo Thực Tế
Lưu snapshot để phân tích sau:
Chuột phải vào ứng dụng → Save Application Snapshot, file .npss sẽ được tạo và có thể mở offline.
So sánh hai heap dumps: Tạo heap dump hai lần ở hai thời điểm khác nhau, chuột phải vào một trong hai → Compare with... để xem sự khác biệt về số lượng object.
Ẩn các process không cần thiết: Tools → Options → General → Hide well known processes để ẩn VisualVM và các process hệ thống.
- Hạn Chế Và Giải Pháp Thay Thế
| Tình huống | VisualVM | Giải pháp thay thế |
|---|---|---|
| Heap dump > 2GB | Chậm, có thể crash | Eclipse MAT |
| Phân tích GC chi tiết | Hạn chế | GCViewer + GC logs |
| Giám sát dài hạn production | Không phù hợp | Prometheus + JMX Exporter + Grafana |
| Profiling method-level | Độ chính xác thấp | Async-Profiler / JProfiler |
- Tóm Tắt
Local giám sát nhanh, Remote qua JMX ổn định, Heap dump dùng MAT, Sampler tìm bottleneck hiệu quả.
Tài Nguyên Tham Khảo
- Trang chủ: https://visualvm.github.io/
- Hướng dẫn sử dụng: https://visualvm.github.io/guides.html
- Plugins: https://visualvm.github.io/plugins.html