Trong thư mục bin của JDK có rất nhiều công cụ dòng lệnh hữu ích cho việc giám sát và phân tích ứng dụng Java. Các công cụ này thường chỉ là lớp vỏ bao bọc quanh thư viện tools.jar, nơi chứa phần lớn logic thực thi. Điều này giúp người dùng có thể chẩn đoán ứng dụng ngay cả khi không có quyền truy cập GUI hoặc môi trường phát triển.
Các công cụ chính
- jps: Liệt kê các tiến trình Java đang chạy
- jstack: Xuất thông tin ngăn xếp luồng (thread dump)
- jmap: Phân tích bộ nhớ heap, tạo heap dump
- jstat: Giám sát hiệu năng và hoạt động GC theo thời gian thực
- jhat: Phân tích heap dump qua giao diện web
- jconsole: Công cụ giám sát JVM trực quan cơ bản
- jvisualvm: Công cụ phân tích nâng cao với nhiều tính năng mở rộng
Java Dump là gì?
Java Dump là ảnh chụp trạng thái của JVM tại một thời điểm nhất định, gồm:
- Thread dump: Trạng thái tất cả các luồng (định dạng văn bản)
- Heap dump: Dữ liệu toàn bộ đối tượng trên heap (định dạng nhị phân)
1. jps – Liệt kê tiến trình Java
$ jps
12345 MyApp.jar
67890 Bootstrap
Một số tùy chọn hữu ích:
jps -l: Hiển thị đường dẫn đầy đủ đến file JAR hoặc tên lớp mainjps -v: Hiển thị các tham số JVM được truyền vào
Lưu ý: jps có thể không hoạt động nếu thư mục /tmp/hsperfdata_{user} bị xóa, đầy ổ đĩa hoặc không có quyền đọc. Trong trường hợp đó, có thể dùng:
ps -ef | grep java
# hoặc
top | grep java
2. jstack – Xuất thread dump
$ jstack 12345
Full thread dump OpenJDK 64-Bit Server VM...
"http-nio-8080-exec-1" #20 daemon prio=5 ...
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
...
Dùng để phát hiện deadlock, vòng lặp vô hạn hoặc luồng bị chặn lâu.
3. jmap – Phân tích bộ nhớ heap
Một số lệnh phổ biến:
jmap <pid>: Hiển thị ánh xạ bộ nhớ chia sẻjmap -heap <pid>: Xem cấu hình và mức sử dụng heapjmap -histo[:live] <pid>: Thống kê số lượng và kích thước đối tượngjmap -dump:format=b,file=heap.hprof <pid>: Tạo heap dump
Ví dụ xuất heap dump:
$ jmap -dump:format=b,file=/tmp/app.hprof 12345
Dumping heap to /tmp/app.hprof...
Heap dump file created
4. jstat – Giám sát hiệu năng theo thời gian thực
Cú pháp:
jstat [option] <pid> [interval] [count]
Một số tùy chọn thường dùng:
-gc: Thống kê chi tiết GC-gcutil: Hiển thị tỷ lệ sử dụng các vùng nhớ (%)-gccapacity: Thông tin dung lượng heap-gcnew,-gcold: Thống kê riêng vùng new/old generation
Ví dụ giám sát mỗi 5 giây, in 10 lần:
$ jstat -gcutil 12345 5000 10
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 45.20 30.10 95.30 90.10 120 2.345 2 0.120 2.465
5. jhat – Phân tích heap dump qua web
$ jhat -port 7001 /tmp/app.hprof
Reading from /tmp/app.hprof...
Started HTTP server on port 7001
Sau đó truy cập http://localhost:7001 để xem kết quả.
6. jinfo – Xem và chỉnh sửa tham số JVM
Xem giá trị tham số:
$ jinfo -flag MaxTenuringThreshold 12345
-XX:MaxTenuringThreshold=15
Bật/tắt tham số boolean:
$ jinfo -flag +PrintGCDetails 12345
$ jinfo -flag PrintGCDetails 12345
-XX:+PrintGCDetails
Lưu ý: Không phải mọi tham số đều hỗ trợ thay đổi lúc runtime.
7. jcmd – Công cụ đa năng (thay thế jmap, jstack)
Liệt kê tiến trình:
$ jcmd -l
Xem các lệnh hỗ trợ cho một tiến trình:
$ jcmd 12345 help
Một số lệnh hữu ích:
Thread.print: Tương đươngjstackGC.heap_dump: Tạo heap dumpGC.run: Kích hoạt garbage collectionVM.flags: Xem các cờ JVMVM.uptime: Thời gian JVM đã chạy
8. Công cụ giám sát trực quan
- JConsole: Đơn giản, tích hợp sẵn, hỗ trợ JMX
- JVisualVM: Mạnh mẽ hơn, hỗ trợ profiling CPU/bộ nhớ, plugin mở rộng
Cả hai đều có thể kết nối đến ứng dụng Java cục bộ hoặc từ xa qua JMX.