Czy generatory śmieci są z natury przyjazne dla pamięci podręcznej?

38

Typowy generacyjny moduł wyrzucający elementy bezużyteczne przechowuje ostatnio przydzielone dane w osobnym regionie pamięci. W typowych programach wiele danych jest krótkotrwałych, więc częste zbieranie śmieci (niewielki cykl GC) i rzadkie zbieranie starych śmieci jest dobrym kompromisem między narzutem pamięci a czasem spędzonym na GC.

Intuicyjnie korzyść generatora śmieciowego generatora w porównaniu z kolektorem jednoregionalnym powinna wzrosnąć wraz ze wzrostem współczynnika opóźnienia pamięci głównej w stosunku do pamięci podręcznej, ponieważ dane w młodym regionie są często dostępne i przechowywane w jednym miejscu. Czy wyniki eksperymentów potwierdzają tę intuicję?

Gilles „SO- przestań być zły”
źródło
powiązana meta dyskusja na temat odpowiednich tagów dla pytania.
Kaveh

Odpowiedzi:

19

Oto kilka artykułów, które mówią o implikacjach pamięci podręcznej generatorów śmieci:

Z tego, co mogę zebrać, głównym problemem jest to, że śmieciowe systemy odkładają miejsce w pamięci, aby uniknąć wstępnego zbierania. To samo dotyczy pamięci podręcznej. Jak zasugerowałeś, rzeczy w pierwszej generacji najprawdopodobniej będą znajdować się w pamięci podręcznej, więc ich przydzielanie i zbieranie będzie znacznie szybsze niż coś w pamięci głównej lub przeniesienie na dysk. Głównym problemem jest rozmiar pierwszej generacji w odniesieniu do wielkości pamięci podręcznej. Jeśli pamięć podręczna zapełni się, zanim zrobi to pierwsza generacja, zaczniesz tracić te korzyści w miarę narastania braków.

Matt Balkam
źródło
10

Istnieje bardzo trudny aspekt wszystkich śmieciarek, które mogą być pomijane w niektórych opisach, a mianowicie „pełne skanowanie” lub „pełne zbieranie”. Okresowo, losowo, sporadycznie muszą skanować wszystkie obiekty. kolekcjonerowie pokoleniowi lepiej odkładają pełny skan i minimalizują czas jego trwania, ale nadal jest on wymagany.

Kolektor pokoleniowy skoncentruje się na przestrzeni zwanej czasem „żłobkiem”, ale ostatecznie / nieuchronnie będzie musiał gromadzić się w przestrzeni „starszej” generacji, powodując pełny skan pamięci.

To pełne skanowanie jest niekompatybilne z prawie wszystkimi schematami buforowania pamięci i (szczególnie!) Schematów wirtualizacji w tym sensie, że prawie wszystkie schematy buforowania pamięci / wirtualizacji będą / musiały zawieść przy jakiejkolwiek poprawie wydajności w tym przypadku.

Tak więc kluczową odpowiedzią na to pytanie jest to, jak często uruchamiany jest pełny skan i jak „zły” jest jego efekt, gdy się to dzieje, i czy można go tolerować. sprowadza się to do bardziej zależnej od aplikacji właściwości / pytania.

Innymi słowy dla „większości” działania kolektora, pamięć podręczna prawdopodobnie mu pomoże (pamięć podręczna i „młoda” przestrzeń żłobkowa na ogół się pokrywają!), Ale są okresowe, przerywane, ewentualne, nieuniknione, ciężkie, może nawet „masywny” [degradujący] wzrost wydajności, gdy przestrzeń „starej generacji” zostanie zapełniona, a „współczynnik trafień” w pamięci podręcznej ulegnie pogorszeniu do bardzo złego, ponieważ wiele obiektów poza nią jest w całości połączonych w ciasną pętlę cykl skanowania / pobierania. Innymi słowy, nieunikniona okresowa nieciągłość (gdzie szacunki statystyczne / średnie / trendy wydajności itp. Wprowadzają w błąd i nie mają zastosowania).

Obecnie pojawiają się nowe systemy gromadzenia danych, które zostały zaprojektowane do współpracy z bazowymi systemami zarządzania pamięcią (buforowanie / wirtualizacja). wydaje się, że podejścia historyczne, które całkowicie oddzielają oddzielne systemy gromadzenia pamięci, buforowania i wirtualizacji, nie będą działać tak dobrze, jak podejścia łączące / integrujące / zajmujące się wszystkimi trzema aspektami razem.

Zobacz np. Zbieranie śmieci ze świadomością pamięci podręcznej przez Zhou i Demsky'ego.

vzn
źródło
Więc mógłby argumentować, że pokoleniowe GC są cache przyjazne w stosunku do nie-pokoleniowych (klasyczny) te?
Raphael
Twierdziłbym, że GC powinien być zaprojektowany w sposób zintegrowany z pamięciami podręcznymi i pamięcią wirtualną w ramach jego projektowania, co jest trudne w istniejących architekturach. jednakże, aby rozwinąć odpowiedź - tak kolektory generacyjne agregują / konsolidują / grupują często używane obiekty w ciągłej pamięci, która z natury będzie bardziej zgodna z pamięcią podręczną niż inne projekty, w których często i rzadko używane obiekty są rozproszone / zmieszane (chociaż te ostatnie nadal będą miały pewne zalety pamięci podręcznej).
vzn
1
Jednym z nieco trudnych aspektów łączenia GC i architektury buforowania / wirtualizacji jest to, że takie architektury na ogół nie dbają o zawartość stron pamięci, ale w systemie GC są do tego zobowiązane. Różne języki czasami obiecują programiście różne funkcje związane z GC, a ustalenie, które funkcje będą obsługiwane na poziomie systemu operacyjnego, może być trudne. Najlepszym podejściem byłoby prawdopodobnie stwierdzenie, że każdy obiekt musi zawierać wskaźnik do struktury, której początkowe pola są zdefiniowane przez system operacyjny, ale po których mogą następować dane specyficzne dla języka, o których system operacyjny nie wiedziałby ani nie dbał.
supercat