2012-12-17 27 views
8

Giả sử tôi đang thử nghiệm một ứng dụng máy chủ Java. Tôi biết phải mất bao nhiêu thời gian để hoàn thành bài kiểm tra. Bây giờ tôi muốn biết số tiền đã được chi cho GC trong thử nghiệm đó. Tôi làm nó như thế nào?Đo thời gian dành cho GC trong JVM

+0

Tôi đếm thời gian để chạy đầu đến cuối trong các thử nghiệm, trong đó có lần GC , và tôi chỉ phá vỡ nó khi tôi muốn hiệu suất điều chỉnh nó ví dụ. với một bộ nhớ hồ sơ. –

Trả lời

21

Tôi đoán rằng khi GC (Garbage Collector) đang làm việc các điểm dừng ứng dụng và tiếp tục khi GC thúc

Tôi không nghĩ rằng đó là một giả định an toàn. Bạn có chắc chắn bộ thu gom rác không hoạt động song song với mã ứng dụng của bạn không?

Để đo thời gian dành cho việc thu thập rác, bạn có thể truy vấn Garbage Collector MXBean.

Hãy thử điều này:

public static void main(String[] args) { 
    System.out.println("collectionTime = " + getGarbageCollectionTime()); 
} 

private static long getGarbageCollectionTime() { 
    long collectionTime = 0; 
    for (GarbageCollectorMXBean garbageCollectorMXBean : ManagementFactory.getGarbageCollectorMXBeans()) { 
     collectionTime += garbageCollectorMXBean.getCollectionTime(); 
    } 
    return collectionTime; 
} 
+3

Câu trả lời này là siêu. Tôi đã thực hiện nhiều thử nghiệm trên GC và các giá trị được cung cấp bởi 'GarbageCollectorMXBean' là hoàn toàn giống so với bản ghi được viết bởi JVM args. –

1

Enable bản ghi thu gom rác thải. Dưới dạng documented, bạn có thể sử dụng các cờ -verbose:gc, -XX:+PrintGCDetails-XX:+PrintGCTimeStamps. -Xloggc cờ có thể được sử dụng để hướng những người đến một tập tin.

Nhật ký kết quả có thể đọc được, nhưng đối với hầu hết lợi ích, bạn có thể muốn chúng được chạy qua máy phân tích. Các công cụ này được liệt kê trong this thread.

2

Chỉ số hiệu suất này được ghi lại bởi JVM và có thể truy cập được thông qua JMX. Để theo dõi tương tác, hãy kết nối với JVM đang chạy với JConsole và trong tab "Tóm tắt VM", nó sẽ có nội dung như sau:

Bộ thu gom rác: Tên = 'Sao chép', Bộ sưu tập = 26, Tổng thời gian = 0,83 giây Bộ thu gom rác: Tên = 'MarkSweepCompact', Bộ sưu tập = 2, Tổng thời gian dành cho 0.168 giây

Bạn cũng có thể truy vấn JMX theo chương trình.

1

Có các thuật toán GC khác nhau hoạt động khác nhau. Gần đây tôi đã đọc good article về chủ đề mà tôi có thể đề xuất nếu bạn muốn biết thêm.

Bạn có thể khởi chạy ứng dụng của mình bằng các tùy chọn dòng lệnh sau -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails và nhận thông tin về GC.

Dưới đây là một ví dụ về thông điệp log:

2012-12-17T03: 02: 15,590-0500: [GC [PSYoungGen: 40934K-> 2670K (29440K)] 48211K-> 14511K (73152K), 0.5745260 giây] [Times: user = 0,08 sys = 0,01, thực = 0,58 giây]

3

Một giải pháp thuận tiện là chạy jstat -gc (documentation) chống lại quá trình của bạn khi xét nghiệm của bạn đã làm xong. Điều đó sẽ cung cấp cho bạn kết quả tổng hợp tốt đẹp về chính xác bao nhiêu thời gian đã được chi tiêu trong GC trong suốt thời gian tồn tại của JVM của bạn.

1

Tương tự như câu trả lời @Steve McLeod rằng sử dụng ManagementFactory, vì Java 8 này cũng có thể được viết trong một dòng duy nhất sử dụng Java streams:

long collectionTime = ManagementFactory.getGarbageCollectorMXBeans().stream().mapToLong(mxBean -> mxBean.getCollectionTime()).sum();