JVM garbage collection i architektura pamięci stronicowania

W ciągu ostatnich 10 lat, kiedy omawiałem Javę i / lub garbage collection, jedyną karą za wydajność, której nie byłem w stanie obronić, jest to, że algorytmy garbage collection mniej lub bardziej psują się podczas uruchamiania w architekturze pamięci paged, a część sterty jest stronicowana.

Systemy Unix (a zwłaszcza Linux) agresywnie odciągają pamięć, która nie była dotykana przez jakiś czas, i chociaż jest to dobre dla przeciętnej wyciekającej aplikacji c, zabija Java perfomance in memory tight situations.

Wiem, że najlepszą praktyką jest utrzymywanie maksymalnej masy ciała mniejszej niż pamięć fizyczna. (Albo zobaczysz zamianę aplikacji na śmierć) ale idea - przynajmniej w świecie Uniksa, jest taka, że pamięć mogłaby być lepiej przeznaczona na pamięci podręczne systemu plików itp.

Moje pytanie brzmi: Czy są jakieś przywoławcze (świadome) algorytmy zbierania śmieci?

Author: KarlP, 2009-05-14

5 answers

Masz rację, garbage collector i virtual memory manager muszą współpracować, w przeciwnym razie GC zniszczy system. Taką współpracę GC/kernel badali Matthew Hertz, Yi Feng i Emery D. Berger. Aby uzyskać dobrą wydajność, musieli nieco rozszerzyć jądro, a także zmodyfikować garbage collector.

Pod wysokim ciśnieniem pamięci, ich benchmark trwał około 160x dłużej przy użyciu GenMS Java GC. Z nowym, page-aware GC, the benchmark był tylko 1,6 razy wolniejszy. Innymi słowy, przy odpowiednio dostrojonym GC istnieje 100-krotne wzmocnienie wydajności.

Http://lambda-the-ultimate.org/node/2391

 5
Author: Sebastien Loisel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-10 22:08:43

Będę twierdzić, że to nie jest tak duży problem, jak myślisz.

Aby upewnić się, że opisujemy to samo: kompletny zbiór wymaga, aby JVM poruszał się po wykresie obiektów w celu zidentyfikowania każdego osiągalnego obiektu; te, które pozostały, są śmieciami. W ten sposób dotknie każdej strony w stosie aplikacji, co spowoduje, że każda strona zostanie uszkodzona w pamięci, jeśli została zamieniona.

Myślę, że to nie jest problem z kilku powodów: Po pierwsze, ponieważ nowoczesne JVM używają kolektorów pokoleniowych, a większość obiektów nigdy nie wychodzi z młodych pokoleń, które są prawie zagwarantowane w zestawie rezydenta.

Po drugie, ponieważ obiekty, które poruszają się z młodego pokolenia, nadal są często dostępne, co ponownie oznacza, że powinny być w zestawie rezydenta. Jest to bardziej delikatny argument, a w rzeczywistości jest wiele przypadków, w których długotrwałe przedmioty nie zostaną dotknięte, z wyjątkiem GC (jeden z powodów, dla których nie wierzę w pamięci podręcznej).

Trzecim powodem (i może być więcej) jest to, że JVM (przynajmniej Słońce JVM) używa kolektora mark-sweep-compact. Tak więc po GC aktywne obiekty w stercie zajmują mniejszą liczbę stron, ponownie zwiększając RSS. Nawiasem mówiąc, jest to główny sterownik dla aplikacji Swing do jawnego wywołania systemu.gc () gdy są zminimalizowane: przez zagęszczenie sterty, jest mniej do zamiany, gdy zostaną ponownie zmaksymalizowane.


Również rozpoznaj tę stertę fragmentacja obiektów C / C++ może być ekstremalna, a Młode obiekty będą rozrzucane pomiędzy starsze, więc RSS musi być większy.

 9
Author: kdgregory,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-14 11:27:16

Nie jestem ekspertem, ale każdy rodzaj pokoleniowego odśmiecania powinien w pewnym stopniu pomóc. Strony, które są agresywnie wymieniane, prawdopodobnie zawierają starsze obiekty, a nie nowsze, więc gc naturalnie dotknie ich rzadziej.

Zadałbym też pytanie przeciwne: czy są jakieś uniksowe algorytmy stronicowania, które są świadome zbierania śmieci? Jeśli dana strona jest zapisywana w pamięci regularnie (jeśli nie często), to może nie jest to taka świetna kandydat przecież do wyrzucenia na rzecz większej ilości pamięci podręcznej dysku; -)

 4
Author: Steve Jessop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-14 11:16:50

Systemy uniksowe (a zwłaszcza Linux) agresywnie odciągają pamięć, która nie była dotykana przez jakiś czas, i chociaż jest to dobre dla przeciętnej wyciekającej aplikacji c, zabija wydajność Java w sytuacjach napiętych z pamięcią.

Należy pamiętać, że zazwyczaj jest to ustawienie przestrajalne -- vm.na przykład Zamiana jądra Linuksa. Możesz przeczytać artykuł na blogu, który napisałem na ten temat jeśli chcesz uzyskać więcej szczegółowych informacji na temat swap-tuning NA Linux.

Czy są jakieś przywoławcze (świadome) algorytmy zbierania śmieci?

Algorytmy Garbage collection są zazwyczaj zaprojektowane dla bardzo szerokiej gamy możliwych programów jako wejścia i do pracy w wielu możliwych środowiskach; ich projekt musi to wziąć pod uwagę. Myślę, że byłoby to naprawdę trudne, aby" stronicowanie świadomy " algorytm gc, który był ogólnie użyteczny. Jeśli piszesz taki dla bardzo wyspecjalizowanego środowiska, w którym możesz zamknijcie sprawy, wtedy myślę, że macie duże szanse na dobry wynik.

 4
Author: John Feminella,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-14 11:27:24

W dzisiejszych czasach programy przywoławcze to naprawdę zły pomysł. Pamięć jest bardzo tania.

FWIW, jeśli jesteś uruchomiony na komputerze od producenta, który lubi ładować kilka razy ponad szanse na pamięć, Windows Vista ma predykcyjny algorytm stronicowania, który działa dość dobrze(być może jedyną rzeczą, że OS robi dobrze).

 0
Author: Tom Hawtin - tackline,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-14 11:41:09