2011-09-02 33 views
5

Mặt trời JVM xuất nhật nhật ký chi tiết GC thành StdOut khi sử dụng arg sau.Nhật ký GC chi tiết Java

-verbose:gc 
-XX:+PrintGCTimeStamps 
-XX:+PrintGCDetails 

Tuy nhiên, tôi không muốn đầu ra trong StdOut và tôi thực sự không cần chi tiết cho từng GC đơn lẻ. Có thể truy cập dữ liệu được sử dụng cho các nhật ký này theo chương trình không? Tôi muốn có thể đăng nhập vào tệp nhật ký của riêng mình lượng bộ nhớ được phân bổ/thu thập và lý tưởng là kích thước đối tượng trung bình theo thời gian.

Trả lời

4

Bạn cần phải thêm

-Xloggc:log_file_name 

Tập tin này được reinitialized mỗi khi JVM bắt đầu, vì vậy không quên để di chuyển nó đến vị trí an toàn nếu bạn muốn giữ nó để phân tích.

Một danh sách đầy đủ của nhiều tùy chọn dòng lệnh Java hiểu có thể tìm thấy here cho Java 6.

+0

Cảm ơn cho việc này. Tôi đã hy vọng sẽ có một API để tôi có thể truy cập dữ liệu này trong thời gian chạy và ghi số liệu thống kê sau mỗi 5 phút về khối lượng dữ liệu được phân bổ, thu thập và được quảng cáo. – mchr

+0

Rất nhiều thông tin liên quan đến việc thu thập rác được thực hiện thông qua JMX, mở 'jconsole' và kiểm tra các mbeans khác nhau mà JVM hiển thị. Có một số câu hỏi ở đây về SO liên quan đến JMX và GC là tốt. Nếu bạn hiểu tiếng Đức bài viết này và mã liên quan có chứa một số ý tưởng thú vị http://www.torsten-horn.de/techdocs/jmx-gc.htm – fvu

+2

Khi JVM 1.6.0_34 bạn có thể có java xoay các bản ghi. '-XX: + Sử dụngGCLogFileRotation -XX: NumberOfGCLogFiles = -XX: GCLogFileSize = ' Lưu ý rằng tất cả ba tùy chọn là bắt buộc. các mẹo khác tại đây: http://jyates.github.io/2012/11/05/rolling-java-gc-logs.html –

0

Bạn có thể sử dụng Đậu JMX cho Pools Memory và GC để thay thế. Họ có lợi thế mà bạn nhận được quầy mà bạn có thể truy vấn trên một lịch trình miễn phí. Điểm bất lợi là, chúng khác nhau đối với các nhà cung cấp, phiên bản và cài đặt GC khác nhau.

Ví dụ

java.lang:type=GarbageCollector,name=Copy 
    CollectionCount, ColletionTime, LastGCInfo[1].duration,memoryUSageBefore/After 
java.lang:type=GarbageCollector,name=MarkSweepCompact 
    CollectionCount, CollectionTime, LastGCInfo[1].duration,memoryUSageBefore/After 
java.lang:type=Memory 
    HeapMemoryUsage[1].commited,init,max,used 
+0

Các giá trị của CollectionTime từ JMX có đáng tin cậy không? Khi tôi so sánh chúng với thời gian được thêm vào từ gc.log và tôi thấy rằng các giá trị JMX quyết liệt thiếu thời gian dành cho GC. –

Các vấn đề liên quan