Middle+
Kāpēc .NET ir nepieciešama lielo objektu krava (Large Object Heap) un mazo objektu krava (Small Object Heap) sadale?
sobes.tech AI
Atbilde no AI
LOH un SOH atdalīšana optimizē atmiņas pārvaldību dažāda lieluma objektiem.
Small Object Heap (SOH)
- Saglabā objektus līdz 85 KB.
- Izmanto paaudžu atkritumu savācēju (Generational Garbage Collection - GC).
- Jaunizveidotie objekti ir 0. paaudzē. Dzīvie objekti tiek pārvietoti uz 1. paaudzi, pēc tam uz 2. paaudzi.
- Atkritumu savākšana ir biežāka un efektīvāka mazākiem objektiem.
// Piemērs, kā izveidot objektu SOH
string smallString = "Tas ir mazs virknē"; // Mazāk par 85 KB
object smallObject = new object(); // Mazs objekts
Large Object Heap (LOH)
- Saglabā objektus ar izmēru 85 KB un vairāk.
- Nav paaudžu atkritumu savācējs, tāpat kā SOH. Parasti tiek tīrīts tikai pilnīgas atkritumu savākšanas laikā (2. paaudzē).
- Atmiņas piešķiršana LOH var būt lēnāka, jo meklē nepārtrauktu atmiņas bloku.
- LOH fragmentācija var radīt problēmas ar lielu objektu piešķiršanu, pat ja kopējā brīva atmiņa ir pietiekama.
- Objektus LOH pēc noklusējuma GC ne pārvieto (s .NET Framework 4.5.1 ir iespēja saspiest LOH, bet tas ir izslēgts pēc noklusējuma un tam ir savas izmaksas). Tas novērš dārgu lielu datu kopēšanu.
// Piemērs, kā izveidot objektu LOH
byte[] largeArray = new byte[100 * 1024]; // Izmērs 100 KB > 85 KB
Priekšrocības atdalīšanai
- Atkritumu savākšanas optimizācija: Paaudžu GC ir daudz efektīvāks mazām, īslaicīgām objektiem SOH. Objektu pārvietošana uz SOH ir relatīvi ātra.
- SOH fragmentācijas samazināšana: Lielu objektu pārvietošana būtu ārkārtīgi dārga un radītu stipru fragmentāciju. To izvietošana atsevišķā LOH kopējā risinājumā šo problēmu atrisina.
- Izmaksu minimizēšana: Lielu objektu pārvietošana uz LOH radītu ievērojamas izmaksas. Noklusējuma GC tos ne pārvieto, tādējādi šīs izmaksas tiek novērstas.
- Atmiņas piešķiršanas veiktspējas uzlabošana: SOH piešķiršana bieži notiek ļoti ātri (ar norādītāju), kamēr LOH var būt nepieciešama piemērota brīva bloka meklēšana. Atdalīšana ļauj saglabāt augstu piešķiršanas ātrumu lielākajai daļai (mazu) objektu.
| Īpašības | Small Object Heap (SOH) | Large Object Heap (LOH) |
|---|---|---|
| Objekta izmērs | Līdz 85 KB | 85 KB un vairāk |
| GC modelis | Paaudžu (0, 1, 2) | Nav paaudžu (pēc noklusējuma) |
| Objektu pārvietošana | Jā (saspiest) | Nē (pēc noklusējuma) |
| Tīrīšanas biežums | Biežāk | Retāk (parasti ar 2. paaudzi) |
| Fragmentācijas risks | Zems (saspiest) | Augsts |