2012-03-14 18 views
9

Jestem mylić o dwa parametry, które mogą kontrolować, gdy rzuty kolektor CMS:CMS garbage collector - kiedy to działa?

MaxHeapFreeRatio (70% domyślnie)

CMSInitiatingOccupancyFraction (ponad 90% domyślnie)

Co każdy z tych parametry oznaczają dokładnie? Kiedy zaczyna się kolektor (faza znakowania) i zbiera (faza zamiatająca)?

Odpowiedz

11

CMSInitiatingOccupancyFraction decyduje o rozpoczęciu CMS (aby ta opcja była efektywna, musisz także ustawić XX: + UseCMSInitiatingOccupancyOnly). MaxHeapFreeRatio to opcja rozmiaru przestrzeni pokoleniowych.

Patrz na przykład ...

http://java.sun.com/docs/hotspot/gc1.4.2/faq.html

Jednoczesne kolekcja generalnie nie można przyspieszyć, ale może być uruchomiony wcześniej. Kolekcja jednoczesna rozpoczyna działanie, gdy procent przydzielonego miejsca w starej generacji przekracza próg. Próg ten jest obliczany na podstawie ogólnych doświadczeń z kolektorami współbieżnymi. Jeśli występują pełne kolekcje, kolekcje współbieżne mogą wymagać wcześniejszego uruchomienia. Flaga linii poleceń CMSInitiatingOccupancyFraction może być używana do ustawiania poziomu, przy którym kolekcja jest uruchamiana. Jego domyślna wartość wynosi około 68%. Wiersz polecenia, aby ustawić wartość jest -XX: CMSInitiatingOccupancyFraction =

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

Domyślnie maszyna wirtualna rośnie lub kurczy sterty w każdej kolekcji, aby spróbować zachować część wolnej przestrzeni do życia obiektów w każda kolekcja w określonym zakresie. Ten docelowy zakres jest ustawiany w procentach według parametrów -XX: MinHeapFreeRatio = i -XX: MaxHeapFreeRatio =, a całkowity rozmiar jest ograniczony poniżej -Xms i powyżej przez -Xmx. Parametry domyślne dla 32-bitowego systemu operacyjnego Solaris (SPARC Platform Edition) przedstawiono w poniższej tabeli:

.. lub ..

http://www.petefreitag.com/articles/gctuning/

-XX: MaxHeapFreeRatio - gdy odsetek za darmo przestrzeń w pokoleniu przekroczyła tę wartość, pokolenie zmniejszy się, aby osiągnąć tę wartość. Domyślnie jest to 70

EDYCJA: Przeprowadziłem kilka symulacji z programem testowym, który po prostu losowo tworzy mapy tablic bajtowych i kopiuje je. Zauważyłem, że a) wartość ułamkowa nie była przestrzegana - w szczególności z ostrożną wartością (na przykład 50) początkowy etap CMS wykopano znacznie poza 50% obłożenia, typowo około 70-80% ib), ale mniejsze wartości ułamkowe spowodowały, że CMS początkowy etap zdarzyć wcześniej (program używany -Xmx1536m -Xmx1536m -XX: NewSize = 512m -XX: + UseConcMarkSweepGc + rejestrowania GC i dwa parametry testowe)

ja również znalazłem stary raport o błędzie dotyczące tego: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6486089

+3

'CMSInitiatingOccupancyFraction' jest używana tylko dla 1. kolekcji, chyba że ustawione jest' -XX: + UseCMSInitiatingOccupancyOnly'. Jeśli nie ustawisz drugiego przełącznika, to po pierwszym, heurystyki (które są oparte na statystykach alokacji zebranych podczas działania) są używane do określenia, kiedy uruchamiany jest CMS. – Matt

+0

Dzięki Matt, dodałem to. – moodywoody

+0

Z niektórych obserwacji wynika, że ​​po kilku godzinach nocnych z niewielkim użyciem nie włączyło się, dopóki nie przekroczyło 90% (to jest "CMSInitiatingOccodzienność", jednak w ciągu dnia nie wydaje się czekać tak długo, ale gromadzi się wcześniej. To wydaje się odpowiadać temu, co powiedział @Matt, ale w tym przypadku chciałbym wiedzieć, co to są "zwykłe heurystyki" i jak długo czas pokoju sprawia, że ​​drzemie i czeka na progu> 90%. –

Powiązane problemy