2009-07-23 38 views
11

Chúng tôi đã bật verbose GC khai thác gỗ để theo dõi một rò rỉ bộ nhớ nổi tiếng và nhận được các mục sau trong nhật ký:"GC--" nghĩa là gì trong nhật ký thu gom rác thải java?

... 
3607872.687: [GC 471630K->390767K(462208K), 0.0325540 secs] 
3607873.213: [GC-- 458095K->462181K(462208K), 0.2757790 secs] 
3607873.488: [Full GC 462181K->382186K(462208K), 1.5346420 secs] 
... 

Tôi hiểu là người đầu tiên và thứ ba của những người, nhưng những gì hiện các "GC- - "một ý nghĩa?

+2

Với dấu thời gian và số lượng bộ nhớ tôi đoán nó đã thực hiện một bộ sưu tập rác nhưng mất bộ nhớ sẵn có (vì các đối tượng khác được tạo song song) – Yishai

+0

Yishai, cảm ơn, điều đó có ý nghĩa rất nhiều. Không chắc chắn nếu nó đúng hay không, nhưng rất tốt có thể được. – RodeoClown

+0

Bạn muốn đặt câu trả lời trong câu trả lời để tôi có thể bỏ phiếu/chấp nhận nó? :) – RodeoClown

Trả lời

12

tôi có các loại dây chuyền sản lượng gc tôi:

44871.602: [GC-- [PSYoungGen: 342848K->342848K(345600K)] 961401K->1041877K(1044672K), 0.1018780 secs] [Times: user=0.16 sys=0.00, real=0.11 secs] 

Tôi đọc câu trả lời Yishai và nó sẽ có ý nghĩa, nhưng tôi muốn nhìn thấy nó cho bản thân mình trong mã nguồn Java GC, khi JVM in "-" trong nhật ký GC và tại sao.

Bởi vì kiến ​​thức của tôi "Parallel Scavenge" của Young Gen là GC dừng lại, nên có không thể là bất kỳ đối tượng nào được tạo song song với GC này. (Xem https://blogs.oracle.com/jonthecollector/entry/our_collectors)

Bạn có thể tìm thấy điều này trong mã nguồn jdk (xem http://hg.openjdk.java.net/jdk7/jdk7) g1CollectedHeap.cpp và psScavenge.cpp

jdk7-ee67ee3bd597/hotspot/src/share$ egrep -h -A2 -B5 -r '"\-\-"' * 
# G1 Collector 
if (evacuation_failed()) { 
    remove_self_forwarding_pointers(); 
    if (PrintGCDetails) { 
    gclog_or_tty->print(" (to-space overflow)"); 
    } else if (PrintGC) { 
    gclog_or_tty->print("--"); 
    } 
} 
-- 
# Parallel Scavenge Collector 
promotion_failure_occurred = promotion_failed(); 
if (promotion_failure_occurred) { 
    clean_up_failed_promotion(); 
    if (PrintGC) { 
    gclog_or_tty->print("--"); 
    } 
} 

Lý do GC-- với Parallel nhặt rác Collector

GC trẻ gặp phải lỗi quảng cáo (xem http://mail.openjdk.java.net/pipermail/hotspot-gc-use/2010-March/000567.html):

Một thất bại khuyến mãi là một scavenge mà không thành công vì không có đủ không gian trong gen cũ để làm tất cả các chương trình khuyến mãi cần thiết. Các scavenge là bản chất unwound và sau đó một đầy đủ STW nén của toàn bộ đống được thực hiện.

'Không đủ không gian' không nhất thiết có nghĩa rằng không có đủ không gian trong cũ, nhưng điều đó không gian cũ là nặng nề rời rạc (xem http://blog.ragozin.info/2011/10/java-cg-hotspots-cms-and-heap.html):

[ ...] không thể tìm thấy số lượng bộ nhớ liên tục nhất định để quảng bá đối tượng lớn cụ thể, mặc dù tổng số byte miễn phí đủ lớn.

Hai tùy chọn JVM có thể giúp bạn phân tích sự phân mảnh của bạn đống (xem http://blog.ragozin.info/2011/10/java-cg-hotspots-cms-and-heap.html):

-XX:+PrintPromotionFailure 
-XX:PrintFLSStatistics=1 

Lý do GC-- với G1 Collector

Một thất bại sơ tán với G1 là khi một khu vực người sống sót không có đủ không gian cho các đối tượng còn sống sót từ một khu vực trẻ.

Tôi không biết liệu Bộ thu G1 có phản ứng với sự thất bại sơ tán với toàn bộ GC hay không.

+0

Vâng, có vẻ khá dứt khoát :) – RodeoClown

0

Nó không phải là trên Java GC FAQ

http://java.sun.com/docs/hotspot/gc1.4.2/faq.html

Cũng không phải là bất cứ điều gì như thế được đề cập trong ví dụ GC trang Java

http://java.sun.com/docs/hotspot/gc1.4.2/example.html

Tôi chưa bao giờ thấy trước đây.

Bạn có bộ thu gom rác đặc biệt nào không? Bạn đang chạy máy ảo nào? Nó có luôn luôn xảy ra trước toàn bộ GC không? Bạn đang gọi System.gc()?

+0

Xin chào e5, không có bộ thu gom rác đặc biệt nào. Máy ảo mặt trời bình thường. Tôi chỉ nhìn thấy nó đôi khi, vì vậy không, nó không phải trước mỗi GC đầy đủ (nhưng tôi không thể nói nếu mỗi khi nó xảy ra nó là trực tiếp trước khi một). Không có System.gc(). – RodeoClown

1

tôi đã nhận như sau từ here:

Hai dòng đầu tiên cho thấy bạn đã hai bộ sưu tập nhỏ và một lớn một. Các con số trước và sau mũi tên cho biết kích thước kết hợp của đối tượng sống trước và sau khi thu gom rác tương ứng. Sau khi số nhỏ bộ sưu tập bao gồm các đối tượng không nhất thiết phải sống nhưng không thể được xác nhận quyền sở hữu, hoặc vì chúng trực tiếp còn hoạt động hoặc bởi vì chúng nằm trong hoặc được tham chiếu từ thế hệ được lưu giữ . Số trong dấu ngoặc đơn tổng số có sẵn không gian, không tính khoảng trống trong thế hệ vĩnh viễn , là tổng số đống trừ một định dạng cho bộ sưu tập chính ở dòng thứ ba tương tự. Cờ -XX: + PrintGCDetails in thêm thông tin về các bộ sưu tập. Các thông tin bổ sung được in với cờ này có thể thay đổi với mỗi phiên bản của máy ảo. Đầu ra bổ sung với các cờ -XX: + PrintGCDetails trong các thay đổi cụ thể với nhu cầu phát triển của Máy ảo Java . của không gian sống sót. Bộ sưu tập nhỏ mất khoảng một phần tư trong một giây.

0

Yishai nói trong các ý kiến:

Với timestamps và bộ nhớ số tiền tôi sẽ đoán nó thực hiện một bộ sưu tập rác nhưng bị mất trí nhớ có sẵn (vì các đối tượng khác được tạo ra song song)

1

Trên thực tế, sau khi gặp phải điều này trong nhật ký của chúng tôi, một đồng nghiệp và tôi có một giải thích thay thế có vẻ phù hợp với sự thật chặt chẽ hơn.

Bạn sẽ nhận thấy trong ví dụ này là một GC đầy đủ tuân theo dòng GC nhỏ lạ này. Tôi có thể xác nhận rằng trường hợp này luôn luôn xảy ra khi nó được ghi lại trong nhật ký của chúng tôi. Bạn cũng có thể thấy rằng kích thước đầu và cuối của Young Gen bằng nhau, và tôi có thể xác nhận lại rằng đây luôn là trường hợp. Chúng tôi tin rằng những gì đang xảy ra ở đây là VM đã bắt đầu một tiểu GC và, sau khi không thể giải phóng bất cứ điều gì hoặc chi tiêu quá lâu mà không thể giải phóng bất cứ điều gì, quyết định làm một thay thế đầy đủ.

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