2013-04-24 8 views
22

Czy pojemnik na odpady z GHC obsługuje szczególnie "duże" obiekty? Czy traktuje je dokładnie tak samo jak każdy inny obiekt?Czy odrzutnik GHC ma jakieś specjalne optymalizacje dla dużych obiektów?

Niektóre silniki GC umieszczają duże obiekty w oddzielnym obszarze, który jest skanowany mniej regularnie i prawdopodobnie ma inny algorytm gromadzenia danych (np. Kompaktowanie zamiast kopiowania lub może nawet korzystanie z freelowców, a nie próba defragmentacji). Czy GHC robi coś takiego?

Odpowiedz

26

Tak. Sterty GHC nie są przechowywane w jednym ciągłym obszarze pamięci; raczej jest to organized into blocks.

Gdy rozmiar przydzielonego obiektu przekracza określony próg (wielkość_bloku * 8/10, gdzie wielkość_bloku wynosi 4k, czyli około 3,2k), blok zawierający obiekt jest oznaczony jako duży (BF_LARGE). Teraz, gdy występuje usuwanie śmieci, zamiast kopiować duże obiekty z tego bloku do nowego, sam blok jest dodawany do zestawu bloków nowej generacji; polega to na manipulowaniu połączoną listą (na przykład dużą listą obiektów).

Ponieważ oznacza to, że odzyskanie martwej przestrzeni wewnątrz dużego bloku może zająć trochę czasu, oznacza to, że duże obiekty mogą cierpieć z powodu fragmentacji, co widać w błędzie 7831. Jednak nie dzieje się tak zazwyczaj, dopóki indywidualne przydziały nie przekroczą połowy wielkości megablocka, 1M.

+4

Czy wartość block_size nie powinna wynosić 5k, a próg 4k w przykładzie? – Sal

+1

Ach tak, masz rację, że odwróciłem mnożenie. block_size to 4k; próg wynosi ~ 3,2 k; Naprawiłem to. –

Powiązane problemy