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

Артықшылықтары бөлудің

  1. Қоқыс жинауды оңтайландыру: Генерациялық GC кіші, қысқа өмір сүретін объектілер үшін SOH-та өте тиімді. Объектілерді SOH-қа көшіру салыстырмалы түрде тез.
  2. SOH-ның фрагментациясын азайту: Үлкен объектілерді көшіру өте қымбат және қатты фрагментацияға әкелуі мүмкін. Оларды бөлек LOH-ға орналастыру бұл мәселені шешеді.
  3. Шығындарды азайту: Үлкен объектілерді LOH-ға көшіру маңызды шығындарға әкеледі. Әдепкі GC оларды көшіруді тоқтатады, бұл шығындарды жояды.
  4. Жадыны бөлу жылдамдығын жақсарту: SOH-да бөлу көбінесе өте тез (көрсеткіш арқылы), ал LOH-да сәйкес бос блокты іздеу қажет болуы мүмкін. Бөлу бұл жылдамдықты сақтауға мүмкіндік береді.
Ерекшеліктер Small Object Heap (SOH) Large Object Heap (LOH)
Объектінің өлшемі 85 КБ дейін 85 КБ және одан көп
GC моделі Генерациялық (0, 1, 2) Генерациялық емес (әдепкі)
Объектілерді көшіру Иә (сығымдау) Жоқ (әдепкі)
Тазалау жиілігі Жиі Аз жиі (әдетте 2-ші ұрпақпен)
Фрагментация қаупі Төмен (сығымдалады) Жоғары