2013-03-09 21 views
10

Tôi đang sử dụng jstat để có được tổng thời gian tích lũy cho các hoạt động GC, tức là GCTTính% thời gian GC trong máy chủ Java

Vì vậy, giả sử GCT là 2 giây, và quá trình JVM của tôi bắt đầu cho 60 giây, tôi có đang chạy trên máy chủ Quad Core hay không, vì vậy% của GC của tôi là

2/60 * 4 = 0.83% 

Tính toán của tôi ở trên có đúng không?

Trả lời

3

không, không thực sự. tính toán của bạn giả định 100% sử dụng tất cả 4 lõi bởi các quá trình java trong suốt thời gian đó.

phép tính chính xác là (time spent in logic)/(time spent in gc) nhưng nhận được thông tin đầu tiên thường đòi hỏi phải có hồ sơ.

+0

Điều đó có ý nghĩa, nhưng có thể lấy lại giá trị của 'thời gian sử dụng trong logic' bằng cách sử dụng jstat hoặc các công cụ khác không? Cảm ơn – Ryan

6

Không, tính toán của bạn không chính xác, bởi vì theo cách này, bạn không biết chính xác thời gian mà hệ điều hành cho phép chương trình của bạn chạy.

Giả sử bạn muốn xem xét thời gian mà các ứng dụng đã được hoàn toàn dừng lại bởi GC (tạm dừng thời gian), bạn có thể sử dụng các tùy chọn JVM sau:

-XX:+PrintGCApplicationConcurrentTime 
-XX:+PrintGCApplicationStoppedTime 

tùy chọn này sẽ làm cho một cái gì đó JVM in như thế này để thiết bị xuất chuẩn:

Application time: 3.3319318 seconds 
Total time for which application threads were stopped: 0.7876304 seconds 
Application time: 2.1039898 seconds 
Total time for which application threads were stopped: 0.4100732 seconds 

Bạn có thể sau đó tổng hợp các lần mà ứng dụng đã được ngừng lại và chia nó bằng tổng của thời gian ứng dụng cộng với thời gian tạm dừng để có được sử dụng mutator (khoảng thời gian ngắn, trong đó ứng dụng không bị tạm dừng bởi GC).

Xem thêm http://prefetch.net/blog/index.php/2008/02/18/measuring-the-time-an-application-was-stopped-due-to-garbage-collection/

+1

bạn có biết tài liệu cho các đối số đó ở đâu không? là thời gian tường ứng dụng hoặc thời gian cpu? – radai

+0

@radai Câu hỏi hay - Tôi không chắc chắn, nhưng tôi sẽ cố gắng tìm ra và cập nhật câu trả lời. –

1

PrintGCDetails - Tùy chọn này có thể hữu ích. Nó prins thông tin về tất cả các bộ sưu tập rác thải.

[GC 
[PSYoungGen: 99952K->14688K(109312K)] 
422212K->341136K(764672K), 0.0631991 secs] 
[Times: user=0.83 sys=0.00, real=0.06 secs] 

Cung cấp thông tin thời gian đã trôi qua của CPU. Giá trị cho quyền của người dùng là thời gian CPU được bộ sưu tập rác sử dụng thực hiện hướng dẫn bên ngoài hệ điều hành. Trong ví dụ này, bộ thu gom rác được sử dụng 0,06 giây trong thời gian CPU của người dùng. Giá trị cho bên phải của sys là thời gian CPU được hệ điều hành sử dụng thay mặt cho bộ thu gom rác. Trong ví dụ này, bộ thu gom rác không sử dụng bất kỳ thời gian CPU nào thực hiện các hướng dẫn của hệ điều hành thay mặt cho bộ sưu tập rác. Giá trị ở bên phải của thực tế là thời gian đồng hồ treo tường trong vài giây của bộ sưu tập rác. Trong ví dụ này, mất 0,06 giây để hoàn thành việc thu gom rác thải.

Java Performance - sách hay, có thể tìm thấy trong phiên bản kỹ thuật số. Chứa bài viết tuyệt vời về đo lường tác động của GC.

+0

THanks, tôi đang sử dụng 'PrintGCDetails' nhưng nó chỉ cho tôi biết thời gian GC, tôi muốn biết tỷ lệ phần trăm để so sánh. – Ryan

+0

Nếm một mục đích rất lạ, nói thành thật. Tại sao không chỉ giảm thiểu thời gian GC đối với trường hợp thử nghiệm giống nhau bằng cách chơi với các loại GC và kích thước thế hệ. – Mikhail

0

Không, phép tính không chính xác.Những gì bạn muốn để tính toán là

(CPU spent on GC)/(total CPU spent on JVM) 

Như đã chỉ ra trong các ý kiến ​​khác, "tổng CPU dành cho JVM" sẽ thấp hơn 60 * 4, như giả định đầy tải hệ thống bằng cách ứng dụng của bạn và không có Chu kỳ CPU được chi tiêu bởi hệ điều hành hoặc bởi các ứng dụng khác. Trên Linux, các lệnh "thời gian" và "ps" có thể được sử dụng để tìm ra số thích hợp ở đây.

Tuy nhiên, cũng "CPU dành cho GC" rất khó tìm ra bằng lệnh jstat. Tôi nghi ngờ rằng jstat báo cáo thời gian ép xung (và không phải CPU lần), mà sẽ vô ích cho việc tính toán ở trên - một lần nữa, bạn không biết liệu GC có nạp đầy đủ tất cả các lõi trong khoảng thời gian wallclock hay không. Đáng ngạc nhiên, không có tài liệu rõ ràng về những loại thời gian (wallclock vs CPU) được báo cáo bởi lệnh jstat - nếu tôi bỏ lỡ điều đó, xin vui lòng để lại một bình luận ở đây.