Sobes.tech
Middle+

A cosa serve la separazione tra Large Object Heap e Small Object Heap in .NET?

sobes.tech AI

Risposta dell'AI

La separazione del Large Object Heap (LOH) e del Small Object Heap (SOH) in .NET ottimizza la gestione della memoria per oggetti di diverse dimensioni.

Small Object Heap (SOH)

  • Memorizza oggetti fino a 85 KB.
  • Utilizza un garbage collector generazionale (Generational Garbage Collection - GC).
  • Gli oggetti recentemente creati cadono nella generazione 0. Gli oggetti sopravvissuti vengono spostati nella generazione 1, poi nella generazione 2.
  • La raccolta dei rifiuti avviene più frequentemente ed è più efficiente per oggetti piccoli.
// Esempio di creazione di un oggetto nel SOH
string smallString = "Questa è una stringa piccola"; // Meno di 85 KB
object smallObject = new object(); // Oggetto piccolo

Large Object Heap (LOH)

  • Memorizza oggetti di 85 KB o più.
  • Non è generazionale nello stesso senso del SOH. Di solito viene pulito solo durante una raccolta completa dei rifiuti (generazione 2).
  • L'allocazione di memoria sul LOH può essere più lenta a causa della ricerca di un blocco di memoria contiguo.
  • La frammentazione del LOH può causare problemi nell'allocazione di grandi oggetti, anche se c'è abbastanza memoria libera in totale.
  • Gli oggetti sul LOH non vengono spostati dal GC di default (con .NET Framework 4.5.1 è stata introdotta l'opzione di comprimere il LOH, ma è disattivata per impostazione predefinita e ha i suoi costi). Questo evita costose copie di grandi volumi di dati.
// Esempio di creazione di un oggetto sul LOH
byte[] largeArray = new byte[100 * 1024]; // Dimensione 100 KB > 85 KB

Vantaggi della separazione

  1. Ottimizzazione della raccolta dei rifiuti: Il GC generazionale sul SOH è molto più efficiente per oggetti piccoli e di breve durata. Spostare gli oggetti nel SOH è relativamente veloce.
  2. Riduzione della frammentazione del SOH: Spostare grandi oggetti sarebbe molto costoso e porterebbe a una forte frammentazione del SOH. Collocarli in un heap separato, il LOH, risolve questo problema.
  3. Minimizzazione dei costi aggiuntivi: Spostare grandi oggetti nel LOH comporterebbe costi significativi. La non migrazione da parte del GC (per impostazione predefinita) evita questo.
  4. Miglioramento delle prestazioni di allocazione della memoria: L'allocazione nel SOH è spesso molto veloce (con puntatori), mentre nel LOH potrebbe essere necessario cercare un blocco libero appropriato. La separazione aiuta a mantenere un'alta velocità di allocazione per la maggior parte degli oggetti (piccoli).
Caratteristica Small Object Heap (SOH) Large Object Heap (LOH)
Dimensione dell'oggetto Fino a 85 KB 85 KB o più
Modello di GC Generazionale (generazioni 0, 1, 2) Non generazionale (per impostazione predefinita)
Spostamento degli oggetti Sì (compattazione) No (per impostazione predefinita)
Frequenza di pulizia Più frequente Meno frequente (di solito con generazione 2)
Rischio di frammentazione Basso (si compatta) Alto