Giới thiệu lệnh jstat -gccapacity
Lệnh jstat là một công cụ mạnh mẽ trong JDK cho phép giám sát hiệu suất của ứng dụng Java. Trong bài viết này, chúng ta sẽ tập trung vào tùy chọn -gccapacity để theo dõi thông tin về bộ nhớ và thu gom rác (garbage collection).
Phân tích kết quả từ jstat -gccapacity
Khi thực thi lệnh jstat -gccapacity, ta sẽ nhận được các thông số tương tự như sau:
8019 14480.4 0 0.0 1.95 8261 14924.6 73 105.5 2.03 8560 15455.4 73 105.5 2.17 8560 15455.4 73 105.5 2.17 8560 15455.4 73 105.5 2.17 8560 15455.4 73 105.5 2.17 8560 15455.4 73 105.5 2.17 8560 15455.4 73 105.5 2.17 8560 15455.4 73 105.5 2.17 8560 15455.4 73 105.5 2.17 8560 15455.4 74 107.1 2.17 8561 15456.9 74 107.1 2.21 8561 15456.9 74 107.1 2.21
Các cột trong kết quả này có ý nghĩa:
- Loaded: Số lượng lớp đã được tải
- Bytes: Dung lượng đã tải (tính bằng KB)
- Unloaded: Số lượng lớp đã được gỡ bỏ
- Time: Thời gian tiêu tốn để tải và gỡ bỏ lớp
Từ kết quả trên, có thể thấy số lượng lớp tải tăng dần theo thời gian và thời gian xử lý cũng có xu hướng tương tự.
Giám sát thu gom rác với jstat -gc
Để theo dõi quá trình thu gom rác, ta sử dụng tùy chọn -gc với cú pháp:
jstat -gc [PID] [khoảng_thời_gian] [số_lần_thực_hiện]
Ví dụ, để kiểm tra GC mỗi 3 giây trong 10 lần:
jstat -gc 42265 3000 10
Kết quả xuất hiện:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 2048.0 2048.0 1216.0 0.0 6656.0 1575.5 22016.0 18366.4 41728.0 38643.1 5888.0 5306.9 64 0.112 2 0.103 0.215 3072.0 3072.0 0.0 0.0 4608.0 2111.9 22016.0 21957.8 43264.0 39703.7 6144.0 5427.9 78 0.140 11 0.511 0.651 3072.0 3072.0 0.0 658.7 4608.0 4180.8 22016.0 15016.6 43520.0 39949.4 6144.0 5471.0 79 0.142 62 3.035 3.177 3072.0 3072.0 1044.6 0.0 4608.0 1328.5 22016.0 15024.6 43776.0 40294.2 6144.0 5512.9 80 0.146 62 3.035 3.181 3584.0 3584.0 0.0 0.0 3584.0 3532.9 22016.0 21730.4 43776.0 40435.1 6144.0 5529.4 93 0.190 94 4.453 4.644 3584.0 3584.0 0.0 0.0 3584.0 2203.4 22016.0 15200.7 43776.0 40435.1 6144.0 5529.4 93 0.190 119 5.574 5.764 3584.0 3584.0 0.0 0.0 3584.0 2445.8 22016.0 15200.7 43776.0 40435.1 6144.0 5529.4 93 0.190 119 5.574 5.764 3584.0 3584.0 0.0 0.0 3584.0 2668.8 22016.0 15200.7 43776.0 40435.1 6144.0 5529.4 93 0.190 119 5.574 5.764 3584.0 3584.0 0.0 0.0 3584.0 2892.2 22016.0 15200.7 43776.0 40435.1 6144.0 5529.4 93 0.190 119 5.574 5.764 3584.0 3584.0 0.0 0.0 3584.0 3119.3 22016.0 15200.7 43776.0 40435.1 6144.0 5529.4 93 0.190 119 5.574 5.764
Giải thích các cột:
- S0C, S1C, S0U, S1U: Dung lượng và sử dụng của Survivor 0 và Survivor 1
- EC, EU: Dung lượng và sử dụng của Eden
- OC, OU: Dung lượng và sử dụng của Old generation
- MC, MU: Dung lượng và sử dụng của Metaspace
- CCSC, CCSU: Dung lượng và sử dụng của Compressed Class Space
- YGC, YGCT: Số lần và thời gian Young GC
- FGC, FGCT: Số lần và thời gian Full GC
- GCT: Tổng thời gian GC
Quan sát kết quả, ta thấy tổng thời gian GC (GCT) tăng từ 0.215 lên 5.764, số lần Full GC tăng từ 2 lên 119, và Young GC tăng từ 64 lên 93. Điều này cho thấy ứng dụng có thể gặp vấn đề về bộ nhớ, dẫn đến việc thu gom rác thường xuyên hơn.
Giám sát biên dịch JIT với jstat -compiler
Để theo dõi hoạt động biên dịch Just-In-Time (JIT), ta sử dụng:
jstat -compiler [PID]
Ví dụ:
jstat -compiler 42559
Kết quả:
Compiled Failed Invalid Time FailedType FailedMethod 3588 0 0 0.87 0
Các cột này cho biết số phương thức đã biên dịch, số lần thất bại, và thời gian biên dịch.
Bằng cách sử dụng các lệnh jstat, các nhà phát triển có thể phân tích hiệu suất bộ nhớ, tối ưu hóa GC và cải thiện hiệu suất ứng dụng Java.