2013-04-24 5 views
22

Il garbage collector GHC gestisce in modo specifico oggetti "grandi"? O li tratta esattamente come qualsiasi altro oggetto?Il garbage collector GHC ha ottimizzazioni speciali per oggetti di grandi dimensioni?

Alcuni motori GC inseriscono oggetti di grandi dimensioni in un'area separata, che viene sottoposta a scansione in modo meno regolare e possibilmente ha un algoritmo di raccolta diverso (ad esempio, compattazione anziché copia, o forse anche l'uso di elenchi freelisti piuttosto che il tentativo di deframmentazione). GHC fa qualcosa di simile?

risposta

26

Sì. L'heap di GHC non viene tenuto in un unico tratto contiguo di memoria; piuttosto, è organized into blocks.

Quando la dimensione di un oggetto assegnato supera una soglia specifica (block_size * 8/10, dove block_size è 4k, quindi circa 3,2k), il blocco che contiene l'oggetto è contrassegnato come grande (BF_LARGE). Ora, quando si verifica la garbage collection, piuttosto che copiare oggetti di grandi dimensioni da questo blocco a uno nuovo, il blocco stesso viene aggiunto al set di blocchi della nuova generazione; questo comporta il giochino con una lista collegata (una lista di oggetti di grandi dimensioni, per essere precisi).

Poiché ciò significa che potrebbe richiedere del tempo per recuperare spazio morto all'interno di un blocco di grandi dimensioni, significa che gli oggetti di grandi dimensioni possono soffrire di frammentazione, come mostrato nell'errore 7831. Tuttavia, questo di solito non si verifica fino a quando le singole allocazioni non raggiungono la metà della dimensione del megablock, 1M.

+4

Non dovrebbe il BLOCK_SIZE essere 5k, e la soglia 4k nell'esempio? – Sal

+1

Ah sì, hai ragione che ho capovolto la moltiplicazione. block_size è 4k; la soglia è ~ 3.2k; L'ho risolto –