Senior
Как се извършва разделянето на обекти в купчини?
sobes.tech AI
Отговор от AI
В .NET, купчината (heap) се дели на две основни поколения: Поколение 0 и Поколение 1. При необходимост, се създава Поколение 2.
- Поколение 0 (Gen 0): Тук се поставят новосъздадените обекти. Това е най-младото и най-малкото поколение. Събирачът на отпадъци (GC) проверява и почиства това поколение по-често. Обектите, които оцеляват след събиране в Gen 0, се преместват в Gen 1.
- Поколение 1 (Gen 1): Съдържа обекти, които са оцелели след събиране в Gen 0. GC проверява това поколение по-рядко от Gen 0. Обектите, които оцеляват след събиране в Gen 1, се преместват в Gen 2.
- Поколение 2 (Gen 2): Съдържа дълготрайни обекти от Gen 1, както и големи обекти. GC проверява това поколение най-рядко. Събирането в Gen 2 е най-скъпото по време.
- Heap за големи обекти (LOH): Специална област на купчината за обекти с размер 85 KB или повече. Обектите в LOH не се преместват от GC, тъй като тяхното преместване е много скъпо. Почистващата операция на LOH се извършва заедно със събирането в Gen 2.
Разделянето на поколения се базира на хипотезата, че наскоро създадените обекти по-често стават отпадъци по-бързо, отколкото дълготрайните. Този подход позволява на GC ефективно да почиства паметта, фокусирайки се върху най-младите поколения.
// Пример за създаване на обекти в Поколение 0
object obj1 = new object();
string str1 = "Hello";
// След първото събиране на отпадъци в Gen 0, ако obj1 и str1 все още са необходими,
// те могат да бъдат преместени в Gen 1.
// Дълготраен обект
List<int> longLivedList = new List<int>();
for (int i = 0; i < 1000; i++)
{
longLivedList.Add(i);
}
// Този списък с времето може да се повиши до Gen 2.
// Голям обект, който ще бъде поставен в LOH
byte[] largeArray = new byte[100 * 1024]; // Размер > 85 KB