2013-04-24 10 views
22

Behandelt der GHC-Garbage Collector "große" Objekte speziell? Oder behandelt es sie genau wie jedes andere Objekt? Bei einigen GC-Engines werden große Objekte in einem separaten Bereich platziert, der weniger regelmäßig gescannt wird und möglicherweise einen anderen Sammlungsalgorithmus verwendet (z. B. Komprimierung statt Kopieren oder sogar die Verwendung von Freelists, anstatt zu defragmentieren). Page 181 Macht GHC so etwas?Hat der GHC Garbage Collector spezielle Optimierungen für große Objekte?

Antwort

26

Ja. Der GHC-Heap wird nicht in einem zusammenhängenden Speicherabschnitt gespeichert. eher ist es organized into blocks.

Wenn die Größe eines zugewiesenen Objekts über einem bestimmten Schwellenwert liegt (block_size * 8/10, wobei block_size 4k ist, also etwa 3,2k), wird der Block, der das Objekt enthält, als groß markiert (BF_LARGE). Wenn die Garbage-Collection jetzt stattfindet, anstatt große Objekte von diesem Block in einen neuen Block zu kopieren, wird der Block selbst zum Blocksatz der neuen Generation hinzugefügt. Dies beinhaltet das Hantieren mit einer verketteten Liste (eine große Objektliste, um genau zu sein).

Da dies bedeutet, dass es eine Weile dauern kann, bis wir toten Raum innerhalb eines großen Blocks zurückgewinnen, bedeutet dies, dass große Objekte unter Fragmentierung leiden können, wie in Bug 7831 zu sehen ist. Dies geschieht jedoch normalerweise erst, wenn die einzelnen Zuweisungen die Hälfte der Megablock-Größe (1M) erreichen.

+4

Sollte nicht die block_size im Beispiel 5k und der Schwellenwert 4k sein? – Sal

+1

Ah ja, du hast Recht, dass ich die Multiplikation umgedreht habe. block_size ist 4k; Schwelle ist ~ 3.2k; Ich habe es repariert. –

Verwandte Themen