Middle+
Zašto je u .NET-u potrebna podela na Heap velikih objekata (Large Object Heap) i Heap malih objekata (Small Object Heap)?
sobes.tech АИ
Одговор од АИ
Razdjeljenje LOH i SOH hrpe optimizuje upravljanje memorijom za objekte različitih veličina.
Small Object Heap (SOH)
- Čuva objekte do 85 KB.
- Koristi generacioni sakupljač smeća (Generational Garbage Collection - GC).
- Nedavno kreirani objekti su u generaciji 0. Preživeli objekti se premeštaju u generaciju 1, zatim u generaciju 2.
- Sakupljanje smeća je češće i efikasnije za male objekte.
// Primer kreiranja objekta na SOH
string smallString = "Ovo je mali niz"; // Manje od 85 KB
object smallObject = new object(); // Mali objekat
Large Object Heap (LOH)
- Čuva objekte veličine 85 KB i više.
- Nije generacioni kao SOH. Obično se čisti samo pri potpunom sakupljanju smeća (generacija 2).
- Alokacija memorije na LOH može biti sporija zbog traženja kontinuiranog bloka memorije.
- Fragmentacija LOH može izazvati probleme sa alokacijom velikih objekata, čak i ako je ukupno dostupna memorija dovoljna.
- Objekti na LOH nisu podrazumevano premeštani od strane GC (sa .NET Framework 4.5.1 je moguće smanjiti LOH, ali je to isključeno po defaultu i ima svoje troškove). To sprečava skupo kopiranje velikih količina podataka.
// Primer kreiranja objekta na LOH
byte[] largeArray = new byte[100 * 1024]; // Veličina 100 KB > 85 KB
Prednosti odvajanja
- Optimizacija sakupljanja smeća: Generacioni GC je mnogo efikasniji za male, kratkotrajne objekte na SOH. Premještanje objekata na SOH je relativno brzo.
- Smanjenje fragmentacije SOH: Premještanje velikih objekata bilo bi izuzetno skupo i dovelo bi do jake fragmentacije SOH. Postavljanje njih na zasebnu hrpu LOH rešava ovaj problem.
- Minimizacija troškova: Premještanje velikih objekata na LOH dovelo bi do značajnih troškova. Podrazumevani GC ih ne premešta, čime se ti troškovi izbegavaju.
- Poboljšanje performansi alokacije memorije: Alokacija na SOH je često vrlo brza (pomoću pokazivača), dok na LOH može biti potrebno traženje odgovarajućeg slobodnog bloka. Odvajanje omogućava održavanje visoke brzine alokacije za većinu (malih) objekata.
| Karakteristika | Small Object Heap (SOH) | Large Object Heap (LOH) |
|---|---|---|
| Veličina objekta | Do 85 KB | 85 KB i više |
| GC model | Generacioni (pokoljenja 0, 1, 2) | Nije generacioni (po defaultu) |
| Premeštanje objekata | Da (kompresija) | Ne (po defaultu) |
| Učestalost čišćenja | Često | Rjeđe (obično sa generacijom 2) |
| Rizik od fragmentacije | Nizak (komprimuje se) | Visok |