2010-02-13 31 views
32

Tôi chưa hiểu thế hệ của Garbage Collection mặc dù tôi đã tìm thấy một số từ google. Có thể một số người trong số các bạn vui lòng cho tôi biết về các điều khoản đơn giản về điều đó.Thế hệ trong Bộ sưu tập rác là gì?

Hoặc có thể tham chiếu đến liên kết sẽ dễ hiểu!

Trả lời

37

Từ Understanding Garbage Collection in .NET

Generations

Một thế hệ garbage collector thu thập các đối tượng trong thời gian ngắn hơn thường xuyên hơn so với những người còn sống. đối tượng ngắn ngủi được lưu trữ trong thế hệ đầu tiên , thế hệ 0. đối tượng còn sống được đẩy vào các thế hệ cao hơn, 1 hoặc 2. Các nhà sưu tập rác làm việc hơn thường xuyên trong các thế hệ thấp hơn trong cao hơn.

Khi một đối tượng được tạo lần đầu tiên, nó là được đưa vào thế hệ 0. Khi số điện thoại thế hệ 0 được lấp đầy, bộ thu gom rác thải được gọi. Các đối tượng mà sống sót trong thu gom rác thải trong thế hệ đầu tiên được đề bạt vào thế hệ kế tiếp cao hơn, thế hệ 1. các đối tượng mà tồn tại rác bộ sưu tập trong thế hệ 1 được đề bạt lên tiếp theo và thế hệ cao nhất, thế hệ 2 Thuật toán này hoạt động hiệu quả cho bộ sưu tập rác của các đối tượng, vì nó là nhanh. Lưu ý rằng thế hệ 2 là thế hệ cao nhất là được bộ thu gom rác hỗ trợ.

Garbage Collection in .NET

Generations

Trong khi cấp phát bộ nhớ trên đống quản lý là nhanh, GC tự có thể mất một thời gian. Với ý nghĩ này, hãy nhớ một số tối ưu hóa đã được thực hiện để cải thiện hiệu suất. GC hỗ trợ khái niệm về các thế hệ, dựa trên giả thiết rằng đối tượng dài hơn là trên một heap, dài hơn, nó có thể sẽ ở lại ở đó. Khi một đối tượng được phân bổ trên đống mà nó thuộc về thế hệ 0. Mỗi bộ sưu tập rác mà các đối tượng sống sót làm tăng thế hệ của nó lên 1 (hiện tại là cao nhất thế hệ được hỗ trợ là 2). Rõ ràng là nhanh hơn để tìm kiếm và thu thập một tập hợp con của tất cả các đối tượng trên một heap, do đó GC có tùy chọn chỉ thu thập các thế hệ 0, 1 hoặc 2 đối tượng (hoặc bất kỳ kết hợp nào) đủ bộ nhớ). Ngay cả khi chỉ thu thập các đối tượng trẻ GC cũng có thể xác định xem các đối tượng cũ có tham chiếu đối với các đối tượng mới để đảm bảo không bị bỏ qua đối tượng đang sử dụng.

17

Có một mô tả ngơi thoải mái tại "Pro C# 2008":

  1. thế hệ 0 xác định một đối tượng mới được tạo ra mà chưa bao giờ được đánh dấu để thu
  2. thế hệ 1 xác định một đối tượng mà đã sống sót sau một GC (đánh dấu để thu thập nhưng không bị xóa vì có đủ không gian vùng heap)
  3. Thế hệ 2 xác định đối tượng đã tồn tại nhiều hơn một lần quét GC.
+0

Xin chào, bạn có thể cho tôi biết khi nào người thu thập thu thập các đối tượng không? Sau khi thực hiện mọi phương pháp? – Bigeyes

+0

Không thích hợp để đặt câu hỏi làm nhận xét trong câu hỏi 7 năm tuổi. Mỗi hướng dẫn Java sẽ cho bạn biết rằng GC chạy trên một luồng riêng biệt tại thời điểm lựa chọn của nó. – duffymo

+0

@duffymo và Java hướng dẫn phải làm gì với câu hỏi Bigeyes? Từ câu hỏi của OP của tôi là về số .net – MaLiN2223

5

blog đầu tiên của tôi trả lời câu hỏi của bạn: Generations of Garbage Allocation

Thêm thông tin về liên kết:

thu rác của CLR (GC) là một nhà sưu tập rác thế hệ, còn được gọi là nhà sưu tập ephermal rác.

Nó có ba thế hệ:

thế hệ 0: Nó chứa tất cả các đối tượng mới được xây dựng mà không bao giờ được kiểm tra bằng phương pháp GC.

Thế hệ 1: CLR, khi khởi tạo, chọn kích thước ngân sách bằng kb cho thế hệ 0. Nếu việc tạo đối tượng làm cho thế hệ 0 vượt quá ngân sách của nó, thì việc thu thập rác sẽ bắt đầu. Các đối tượng không được thu thập trong thế hệ 0 được di chuyển đến thế hệ 1 và thế hệ 0 được làm trống. Giả sử ngân sách của Thế hệ 0 bằng kích thước của 5 đối tượng. Vì vậy, thế hệ 0 sẽ trông giống như dưới đây trước khi tạo ra các đối tượng 6:

enter image description here

Sau khi tạo ra các đối tượng 6, phân bổ rác được bắt đầu mà deallocates các đối tượng rác 1, 3 và 5 và di chuyển 2 và 4 tiếp giáp với mỗi khác trong thế hệ 1.

enter image description here

Kích thước ngân sách của thế hệ 1 cũng được chọn bởi CLR khi khởi tạo. Tạo ra các đối tượng 11 gây GC để bắt đầu một lần nữa có thể di chuyển một số đối tượng hơn đối với thế hệ 1.

enter image description here

thế hệ 1 là bỏ qua cho Garbage Collection cho đến khi nó đạt đến kích thước ngân sách của nó cho Thu gom rác, giúp cải thiện hiệu suất của GC.

thế hệ 2:

Trong vài thế hệ 0 bộ sưu tập, thế hệ 1 có thể vượt qua giới hạn ngân sách của nó gây GC để thu thập rác từ cả hai thế hệ. Trong trường hợp này, những người sống sót trong thế hệ 1 được quảng bá cho thế hệ 2, những người sống sót sau thế hệ 0 được thăng cấp thành thế hệ 1 và thế hệ 0 trống.

Giả sử đối tượng phân bổ 21 gây ra thu gom rác thải và ngân sách thế hệ 1 đã đạt được. enter image description here

Vì vậy, đống sẽ trông giống như dưới đây với các đối tượng mà sống sót trong thế hệ này sang thế hệ 1 bạt 2.

enter image description here

Vì vậy, về cơ bản thế hệ GC giả định rằng đối tượng mới có khả năng hơn để thu thập.

Chúng tôi biết rằng CLR chọn ngân sách cho cả ba thế hệ nhưng nó có thể sửa đổi chúng khi GC là một bộ thu tự điều chỉnh. Nếu GC thấy rằng có rất ít các đối tượng còn sống sau khi thu thập thế hệ 0, nó có thể quyết định giảm ngân sách của thế hệ 0, do đó công việc ít hơn được thực hiện. Mặt khác, nếu GC thu thập thế hệ 0 và thấy rằng có rất nhiều đối tượng còn sống sót, không có nhiều bộ nhớ được thu hồi trong bộ sưu tập rác. Trong trường hợp này, người thu gom rác sẽ tăng ngân sách của thế hệ 0. GC cũng sửa đổi ngân sách của thế hệ 1 và thế hệ 2 tương ứng.

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ đánh giá/bài đăng chất lượng thấp/17323312) – 1ac0

+1

Sao chép nội dung từ blog để trả lời. –

+1

@DeepakMishra cảm ơn bạn đã chỉnh sửa câu trả lời của mình. Nó trông tuyệt vời bây giờ và nỗ lực thực sự được đánh giá cao. – g00glen00b

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