Các công cụ phân tích phổ biến trong JDK

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 main
  • jps -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 heap
  • jmap -histo[:live] <pid>: Thống kê số lượng và kích thước đối tượng
  • jmap -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 đương jstack
  • GC.heap_dump: Tạo heap dump
  • GC.run: Kích hoạt garbage collection
  • VM.flags: Xem các cờ JVM
  • VM.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.

Thẻ: jdk JVM java-monitoring jstack jmap

Đăng vào ngày 18 tháng 8 lúc 22:18