Khi nói đến các đối tượng được quản lý, có ba Vùng đối tượng nhỏ (SOH) và một đối tượng lớn (LOH).
Large Object Heap (LOH)
Đối tượng có dung lượng lớn hơn 85KB sẽ Loh ngay lập tức. Có một số rủi ro nếu bạn có quá nhiều vật thể lớn. Đó là một cuộc thảo luận khác nhau, để biết thêm chi tiết có một cái nhìn tại The Dangers of the Large Object Heap
nhỏ Object Heap (SOH): Gen0, Gen1, Gen2
thu rác sử dụng một thuật toán thông minh để thực hiện collecton rác chỉ khi nó là cần thiết. Quy trình thu gom rác đầy đủ là một hoạt động tốn kém không nên xảy ra quá thường xuyên. Vì vậy, nó đã phá vỡ SOH của nó thành ba phần và như bạn đã nhận thấy mỗi Gen có một số lượng quy định của bộ nhớ.
Mỗi đối tượng nhỏ (< 85KB) ban đầu sẽ chuyển thành Gen0. Khi Gen0 đầy, thu gom rác chỉ thực hiện cho Gen0. Nó kiểm tra tất cả các cá thể trong Gen0 và xóa/giải phóng bộ nhớ được sử dụng bởi bất kỳ đối tượng không cần thiết nào (không được tham chiếu, ngoài các đối tượng được sắp xếp hoặc sắp xếp). Và sau đó nó sao chép tất cả các yêu cầu (trong sử dụng) trường hợp để Gen1.
Trên quá trình được thực sự xảy ra ngay cả khi bạn thực hiện dưới đây: (không nhất thiết phải gọi bằng tay)
// Perform a collection of generation 0 only.
GC.Collect(0);
Bằng cách này, nhà sưu tập rác xóa bộ nhớ được cấp phát cho các trường hợp sống ngắn đầu tiên (dây đó là bất biến, các biến trong phương thức hoặc phạm vi nhỏ hơn).
Khi GC tiếp tục thực hiện thao tác này ở một giai đoạn, Gen1 tràn. Sau đó, nó hoạt động tương tự với Gen1. Nó xóa tất cả bộ nhớ không cần thiết trong Gen1 và sao chép tất cả các bộ nhớ cần thiết vào Gen2.
Trên quá trình là xảy ra khi bạn thực hiện dưới đây bằng tay (không nhất thiết phải gọi bằng tay)
// Perform a collection of all generations up to and including 1.
GC.Collect(1);
Khi GC là giữ thực hiện thao tác này tại một sân khấu nếu Gen2 tràn nó cố gắng để làm sạch Gen2.
quá trình Trên đây là xảy ra ngay cả khi bạn thực hiện dưới đây bằng tay (không nhất thiết phải làm bằng tay)
// Perform a collection of all generations up to and including 2.
GC.Collect(2);
Nếu dung lượng bộ nhớ cần được sao chép từ Gen1 để Gen2 lớn hơn dung lượng bộ nhớ có sẵn trong Gen2, GC ném ra khỏi ngoại lệ bộ nhớ.
Điều này có thể liên quan đến cách bộ thu gom rác C# hoạt động. Tôi nghĩ rằng đó là một GC thế hệ, phân tách dữ liệu dựa trên cách nó được sử dụng gần đây. – ryanyuyu
Có 3 đống + đống đối tượng lớn. Tất cả các đối tượng được phân bổ trong heap 0. Nếu chúng tồn tại trong một bộ sưu tập rác, chúng sẽ được tăng lên 1, sau đó đến heap 2, và sau đó vẫn ở đó cho đến khi được thu thập. Heap đối tượng lớn (LOH) là cho các đối tượng có kích thước từ 85000 byte trở lên (không phải trong tổng số, liên tục, giống như mảng). Nơi bạn có đống thứ năm từ tôi không biết. –
Có thể quan tâm: http: // stackoverflow.com/questions/11189932/stack-and-heap-phân bổ –