Middle+
რატომ არის საჭირო დიდი ობიექტების heap-ის (Large Object Heap) და მცირე ობიექტების heap-ის (Small Object Heap) განყოფილება .NET-ში?
sobes.tech AI
პასუხი AI-სგან
LOH һәм SOH қоқыс жәшіктерін бөлу жадыны басқаруды әртүрлі өлшемдегі объектілер үшін оңтайландырады.
Small Object Heap (SOH)
- 85 КБ-ға дейінгі объектілерді сақтайды.
- Генерациялық қоқыс жинағышты (Generational Garbage Collection - GC) пайдаланады.
- Жақында жасалған объектілер 0-ші ұрпақта орналасады. Өмір сүрген объектілер 1-ші ұрпаққа, содан кейін 2-ші ұрпаққа көшіріледі.
- Қоқыс жинау жиі және тиімдірек кіші объектілер үшін.
// SOH-да объект жасау мысалы
string smallString = "Бұл кішкентай жол"; // 85 КБ-дан аз
object smallObject = new object(); // Кіші объект
Large Object Heap (LOH)
- 85 КБ және одан үлкен объектілерді сақтайды.
- Бұл генерациялық емес, SOH сияқты. Әдетте, толық қоқыс жинау кезінде ғана тазаланады (2-ші ұрпақ).
- LOH-да жадыны бөлу баяу болуы мүмкін, себебі үздіксіз жады блогын іздеу керек.
- LOH-ның фрагментациясы үлкен объектілерді бөлу мәселелерін тудыруы мүмкін, тіпті жалпы бос жады жеткілікті болса да.
- LOH-дағы объектілер әдепкі бойынша GC арқылы орын ауыстырмайды (с .NET Framework 4.5.1, LOH-ты сығымдау мүмкіндігі бар, бірақ ол әдепкі бойынша өшірілген және өз шығындары бар). Бұл үлкен деректердің қымбат көшірмесін болдырмайды.
// LOH-да объект жасау мысалы
byte[] largeArray = new byte[100 * 1024]; // 100 КБ > 85 КБ
Артықшылықтары бөлудің
- Қоқыс жинауды оңтайландыру: Генерациялық GC кіші, қысқа өмір сүретін объектілер үшін SOH-та өте тиімді. Объектілерді SOH-қа көшіру салыстырмалы түрде тез.
- SOH-ның фрагментациясын азайту: Үлкен объектілерді көшіру өте қымбат және қатты фрагментацияға әкелуі мүмкін. Оларды бөлек LOH-ға орналастыру бұл мәселені шешеді.
- Шығындарды азайту: Үлкен объектілерді LOH-ға көшіру маңызды шығындарға әкеледі. Әдепкі GC оларды көшіруді тоқтатады, бұл шығындарды жояды.
- Жадыны бөлу жылдамдығын жақсарту: SOH-да бөлу көбінесе өте тез (көрсеткіш арқылы), ал LOH-да сәйкес бос блокты іздеу қажет болуы мүмкін. Бөлу бұл жылдамдықты сақтауға мүмкіндік береді.
| Ерекшеліктер | Small Object Heap (SOH) | Large Object Heap (LOH) |
|---|---|---|
| Объектінің өлшемі | 85 КБ дейін | 85 КБ және одан көп |
| GC моделі | Генерациялық (0, 1, 2) | Генерациялық емес (әдепкі) |
| Объектілерді көшіру | Иә (сығымдау) | Жоқ (әдепкі) |
| Тазалау жиілігі | Жиі | Аз жиі (әдетте 2-ші ұрпақпен) |
| Фрагментация қаупі | Төмен (сығымдалады) | Жоғары |