Sử dụng lệnh jstat -gccapacity để giám sát bộ nhớ Java

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.

Thẻ: jstat gc Java monitoring performance

Đăng vào ngày 10 tháng 6 lúc 21:46