Sobes.tech
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

  1. Optimizacija sakupljanja smeća: Generacioni GC je mnogo efikasniji za male, kratkotrajne objekte na SOH. Premještanje objekata na SOH je relativno brzo.
  2. 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.
  3. 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.
  4. 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