Theo dõi hiệu năng JVM là hoạt động diễn ra trong suốt thời gian vận hành ứng dụng. Việc phân tích thông tin thu được từ quá trình theo dõi hiệu năng JVM cho biết khi nào thì cần tiến hành điều chỉnh hiệu năng. Với nhiều ứng dụng Java, sau một thời gian sử dụng, số lượng người dùng và lượng dữ liệu gia tăng cũng có thể làm thay đổi hiệu năng của ứng dụng.

Có một số hoạt động bên trong JVM cần theo dõi bao gồm quá trình thu dọn bộ nhớ (Garbage Collection), hoạt động biên dịch JIT (JIT Compilation) và quá trình nạp lớp đối tượng (Class loading). Nhiều công cụ có sẵn để theo dõi JVM. Một số công cụ theo dõi được phân phối sẵn kèm trong bộ JDK, một số là công cụ miễn phí, và phần còn lại là các công cụ thương mại. Các công cụ theo dõi được trình bày trong bài viết này là phần mềm miễn phí hoặc mã nguồn mở.

Theo dõi quá trình Garbage Collection

Dữ liệu cần được quan tâm về GC

  • Kích thước của Java Heap
  • Kích thước của vùng young generation, old generationpermanent generation.
  • Thời gian và tần suất thực hiện và dung lượng vùng nhớ thu hồi được từ minor garbage collection.
  • Thời gian và tần suất thực hiện và dung lượng vùng nhớ thu hồi được từ major garbage collection.
  • Sự chiếm giữ vùng nhớ của young generation, old generationpermanent generation trước và sau khi thực hiện garbage collection.
  • Sự chiếm giữ vùng nhớ của old generation hay permanent generation quyết định kích hoạt quá trình thu dọn toàn bộ?
  • Liệu ứng dụng Java có sử dụng lệnh thu dọn bộ nhớ tường minh System.gc() không?

Tham số dòng lệnh hiển thị thông tin GC

Tham số -verbose:gc

Hiển thị thông tin chi tiết về quá trình thu dọn bộ nhớ ra màn hình Console mỗi khi GC thực thi.

$ java -client –verbose:gc -Xmx12m -Xms3m -Xmn1m
    -XX:PermSize=20m -XX:MaxPermSize=20m
    -jar /usr/java/demo/jfc/Java2D/Java2Demo.jar
...
[GC 1884K->1299K(5056K), 0.0031820 secs]
...

Thông tin [GC 1884K->1299K(5056K), 0.0031820 secs] hiển thị ở Console có ý nghĩa như sau:

  • GC: đây là một minor garbage collection. Giá trị Full GC nếu là một full garbage collection.
  • 1884K: Kích thước Java Heap trước khi thực thi GC
  • 1299K: Kích thước Java Heap sau khi thực thi GC
  • 5056K: Tổng kích thước của Java Heap
  • 0.0031820 secs: Tổng thời gian thực thi GC

Tham số -XX:+PrintGCDetails

Mặc dù -verbose:gc được dùng phổ biến nhất, tuy nhiên -XX:+PrintGCDetails hiển thị nhiều thông tin hơn về các quá trình thu dọn bộ nhớ.

$ java –client –XX:+PrintGCDetails -Xmx12m -Xms3m -Xmn1m
    -XX:PermSize=20m -XX:MaxPermSize=20m
    -jar /usr/java/demo/jfc/Java2D/Java2Demo.jar
...
[GC [DefNew: 490K->64K(960K), 0.0032800 secs] 5470K->5151K(7884K),
0.0033270 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
...
[Full GC (System) [Tenured: 5087K->5151K(6924K), 0.0971070 secs]
6047K->5151K(7884K), [Perm : 11178K->11178K(16384K)],
0.0972120 secs] [Times: user=0.10 sys=0.01, real=0.10 secs]
...

Hiển thị thêm thông tin về ngày giờ

  • Tham số -XX:+PrintGCTimeStamps: Hiển thị thêm phần thời gian (tính bằng giây) từ khi kích hoạt máy ảo.
  • Tham số -XX:+PrintGCDateStamps: Hiển thị thêm thông tin về thời điểm (theo định dạng YYYY-MM-DDTHH.MM.SS.mmm-tttt) khi quá trình GC diễn ra.

Hiển thị thông tin về thời gian dừng

  • -XX:+PrintGCApplicationStoppedTime: Hiển thị thêm lượng thời gian mà ứng dụng tạm ngưng để thực hiện quá trình thu dọn bộ nhớ (Garbage Collection). Lưu ý quá trình này là hoạt động đòi hỏi phát sinh sự kiện Stop the World.
  • -XX:+PrintGCApplicationConcurrentTime: Lượng thời gian ứng dụng chạy giữa hai lần thực hiện quá trình thu dọn bộ nhớ (Garbage Collection).

Ghi dữ liệu ra tệp bằng -Xloggc

Tham số -Xloggc:<filename> được dùng để đẩy thông tin của quá trình thu dọn bộ nhớ (Garbage Collection) ra tệp bên ngoài, nhằm phục vụ quá trình phân tích về sau. Tham số -Xloggc được dùng kèm với -verbose:gc hoặc -XX:+PrintGCDetails.

Công cụ dòng lệnh theo dõi Garbage Collection

jps

jps là ứng dụng dòng lệnh dùng để tìm và hiển thị các tiến trình java hiện đang chạy. Mục đích của jps là để xác địch ProcessID của các tiến trình Java. jps được đóng gói và phần phối cùng với JDK. Xem thông tin đầy đủ về jps tại trang tooldocs của Java Oracle.

jstat

jstat là ứng dụng dòng lệnh hiển thị thống kê hiệu năng chi tiết về một HotSpot VM cục bộ hoặc từ xa. Cú pháp chung của công cụ này có dạng như sau:

$ jstat -<option> [-t] [-h<lines>] <vmid> [<internal> [<count>]]

Các tùy chọn liên quan đến Garbage Collection bao gồm: -gc, -gccapacity, -gccause, -gcnew, -gcnewcapacity, -gcold, -gcoldcapacity, -gcpermcapacity, -gcutil. Trong đó, tùy chọn –gctuil thường được sử dụng nhiều nhất.

Công cụ đồ họa theo dõi Garbage Collection

jconsole

jconsole là phần mềm quản lý và theo dõi JVM có giao diện đồ họa, được đóng gói và phân phối cùng với bộ JDK. jconsole hỗ trợ cả công nghệ JMX lẫn MBean. Nhờ đó, jconsole có thể theo dõi nhiều JVM cùng lúc. Không những vậy, nhiều phiên làm việc (session) của jconsole có thể cùng theo dõi một phiên làm việc của một JVM. jconsole có khả năng theo dõi những đặc điểm của JVM sau:

  • Memory usage by memory pool/spaces
  • Garbage collection
  • JIT compilation
  • Class loading
  • Threading and logging
  • Thread monitor contention

Giao diện chương trình jconsole

VisualVM

VisualVM là công cụ theo dõi và đo dạc hiệu năng giao diện đồ họa, được đóng gói và phân phối cùng với JDK (từ bản JDK6 update 7 trở đi). Sau khi đã cài đặt JDK, người dùng có thể kích hoạt VisualVM bằng cách dùng lệnh jvisualvm từ cửa sổ dòng lệnh.

Công cụ này hỗ trợ một số tính năng chính sau:

  • Tích hợp với các công cụ JDK, bao gồm jconsole và một phần NetBeans Profiler.
  • Phân tích hiệu năng (Performance analysis) và khắc phục sự cố (troubleshooting) bao gồm dò tìm thread deadlock và xử lý tranh chấp thread monitor.
  • Dễ dàng mở rộng thông qua plug-in API. Các plugin đã được phát triển và có thể cài đặt và sử dụng:
    • jconsole
    • VisualGC plug-in
    • Glassfish plug-in
    • btrace plug-in

Giao diện chương trình jvisualvm

VisualGC

VisualGC phần mềm theo dõi JVM, có thể sử dụng dưới dạng ứng dụng giao diện đồ họa độc lập hoặc dưới dạng plugin của VisualVM. Người ta thường sử dụng VisualGC dưới dạng VisualVM plugin, được cài đặt vào VisualVM từ plugin center của VisualVM. Bằng VisualGC, người dùng có thể nhìn thấy trực quan trên màn hình chính xác những gì đang được Garbage Collector thực hiện. Ngoài thông tin về Garbage Collection, VisualGC còn hiển thị thông tin về Class loadingJIT compilation.

Giao diện chương trình VisualGC

GCHisto

Chương trình GCHisto là công cụ giao diện đồ họa dùng để phân tích các tệp log. GCHisto cho phép so sánh kích thước vùng Heap hoặc các loại Garbage Collector khác nhau bằng cách so sánh các file GC logs.

Giao diện chương trình GCiHisto

Comments