2013-05-14 34 views
19

Tôi đã đọc về Bộ sưu tập rác trong Java và SO Q & A nhưng tôi đã nhầm lẫn về các loại bộ sưu tập rác.Bộ sưu tập chính và bộ sưu tập nhỏ của Java

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 để làm các bộ sưu tập Nhỏ và một chuỗi cho Các bộ sưu tập chính (giống như bộ thu nối tiếp).

Bây giờ câu hỏi của tôi:

  1. 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?
  2. Nếu a), điều đó có nghĩa là Bộ sưu tập nhỏ vẫn được thực hiện bằng cách sử dụng nhiều luồng trong khi Chính được thực hiện bằng cách sử dụng Đơn?
  3. Nếu b), có nghĩa là cả hai Trẻ & Thế hệ cũ đã bị xóa bằng cách sử dụng một chuỗi?

Ngoài ra, 4. GC có chỉ ảnh hưởng đến OldGeneration hoặc YoungGeneration không?

Xin cảm ơn trước.

+1

+1. Cảm ơn bạn đã đặt câu hỏi của tôi – Imposter

Trả lời

27

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?

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âu hỏi rõ ràng và câu trả lời rõ ràng trong pha lê – Imposter

+2

Ngoài ra còn có '-XX: + UseG1GC' trong HotSpot 6 (không phải là bản phát hành đầu tiên) và 7, quản lý cả thế hệ cũ lẫn trẻ. –

0

Trong khi trả lời yêu tinh là vẫn đúng trong đột quỵ rộng ít nhất một phần này bây giờ đã lỗi thời:

Nó phụ thuộc. JVM báo cáo mọi Bộ sưu tập chính là Toàn bộ GC.

Cả CMS và G1 đều phân biệt giữa các bộ sưu tập thế hệ mới (nhỏ), bộ sưu tập đồng thời của thế hệ cũ và toàn bộ gcs. Sau này là một điều gì đó của một điều cuối cùng và hầu hết các GCing nên được xử lý bởi bộ sưu tập gen và đồng thời mới.