Hãy để tôi giải thích.
Hãy lấy Bộ thu thông lượng làm ví dụ. (aka Parallel Collector). Các tài liệu nói rằng nó sử dụng nhiều luồng để thực hiện các bộ sưu tập nhỏ và chuỗi đơn cho các bộ sưu tập chính (giống như bộ sưu tập nối tiếp).
Đây là điều cần hiểu. Theo mặc định, trên hầu hết các hệ thống mới hơn, JVM sử dụng HAI Bộ thu gom rác khác nhau cho thế hệ trẻ và cũ. Trên máy của tôi: Tôi có Bộ thu thập song song mới cho thế hệ trẻ và Bộ thu thập đồng thời và quét quét cho thế hệ cũ hơn.
Bộ sưu tập nhỏ được kích hoạt khi JVM không thể phân bổ không gian cho một đối tượng mới (Hãy nhớ: đối tượng mới luôn được phân bổ trong Khu vực Eden của thế hệ trẻ).
Câu hỏi tiếp theo:
có nghĩa là gì bởi một GC đầy đủ: a) Liệu nó có nghĩa cả hai nhỏ và bộ sưu tập chính được thực hiện? Hoặc b) Toàn bộ GC == Bộ sưu tập chính? Đó là cái nào?
và
Ngoài ra, 4. Liệu Full GC chỉ ảnh hưởng đến OldGeneration hoặc YoungGeneration không?
Tùy theo. JVM báo cáo mọi Bộ sưu tập chính là Toàn bộ GC. [Hãy thử với những lá cờ này java -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamp
].Định nghĩa pedantic là Full GC chạy Minor đầu tiên theo sau Major (Mặc dù thứ tự có thể được chuyển đổi nếu thế hệ cũ đầy, trong trường hợp nó được giải phóng trước để cho phép nó nhận các đối tượng từ thế hệ trẻ).
OK, quay lại điểm. JVM xem xét bộ sưu tập chính [trong thế hệ cũ hơn (hoặc Perm)] dưới dạng toàn GC. Dưới đây là kết quả đầu ra từ một chương trình mà tôi đã có thể viết nhanh để minh họa điểm. Dòng đầu tiên là nhỏ GC và thứ hai là chính (đầy đủ) GC. Bạn có thể thấy rằng nó chỉ xảy ra trong thế hệ cũ (CMS) và có thể giảm thế hệ cũ từ 1082K xuống 1034K.
11.431: [GC 11.431: [ParNew: 1152K->128K(1152K), 0.0009893 secs] 2111K->1210K(6464K), 0.0010182 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
17.882: [Full GC (System) 17.882: [CMS: 1082K->1034K(5312K), 0.0212614 secs] 2034K->1034K(6464K), [CMS Perm : 9426K->9410K(21248K)], 0.0213200 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
Câu hỏi tiếp theo:
Nếu a), điều đó có nghĩa rằng bộ sưu tập nhỏ vẫn thực hiện bằng nhiều luồng trong khi chính đã được thực hiện sử dụng Single?
Có. Xem phần đầu câu trả lời của tôi. Các thế hệ trẻ và cũ hơn được phục vụ bởi các nhà sưu tập khác nhau. Đối với thế hệ trẻ, bạn có thể sử dụng bất kỳ một trong các cách sau:
-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+UseParNewGC
Đối với thế hệ cũ, các lựa chọn có sẵn là:
-XX:+UseParallelOldGC
-XX:+UseConcMarkSweepGC
+1. Cảm ơn bạn đã đặt câu hỏi của tôi – Imposter