2012-11-24 11 views
24

Przeszukałem cały ten temat przez cały dzień. Ale nadal nie jest dla mnie jasne, więc pytanie może wydawać się nieco urojone.
MaxTenuringThreshold - jak dokładnie działa?

Cóż .. wiemy, że istnieje kilka głównych domen pamięci. Young, Tenured (Old gen) i PermGen.

Młoda domena jest podzielona na Eden i Survivor (dwa). OldGen jest dla obiektów, które przetrwały.
Odnośnie MaxTenuringThreshold - zatrzymuje zbyt szybkie kopiowanie obiektów do przestrzeni OldGen.
Jest to całkiem jasne i zrozumiałe.

Ale to "MaxTenuringThreshold" ... - jak to dokładnie działa?
W jaki sposób odśmiecacz ma do czynienia z tymi obiektami, które nadal przetrwały do ​​MaxTenuringThreshold iw jaki sposób? Gdzie one się znajdują?
Obiekty są kopiowane z powrotem do pomieszczeń Survivor w celu zbierania śmieci. Czy dzieje się tak jakoś inaczej?

Nie znalazłem żadnego dobrego wytłumaczenia tego, więc będę wdzięczny za wszelkie przydatne linki lub wyjaśnienia.

Odpowiedz

47

Każdy obiekt w sterty Java ma nagłówek, który jest używany przez algorytm Garbage Collection (GC). Młody kolektor przestrzeni (odpowiedzialny za promocję obiektu) używa kilku bitów z tego nagłówka do śledzenia liczby zachowanych obiektów kolekcji (32-bitowa maszyna JVM używa 4 bitów do tego, 64-bitowy prawdopodobnie więcej) .

Podczas młodego zbierania przestrzeni każdy pojedynczy obiekt jest kopiowany. Obiekt może zostać skopiowany do jednej z przestrzeni przetrwania (pustej przed młodym GC) lub do starej przestrzeni. Dla każdego kopiowanego obiektu, algorytm GC zwiększa jego wiek (liczba kolekcji przeżyła) i jeśli wiek jest powyżej bieżącego próg dzierżawy, zostanie skopiowany (promowany) do starej przestrzeni. Obiekt może być również skopiowany do starej przestrzeni bezpośrednio, jeśli przestrzeń przetrwania jest pełna (przepełnienie).

Podróż Obiekt ma następujący wzór:

  • przydzielane w eden
  • skopiowane z eden do przestrzeni przeżycia z powodu młodego GC
  • skopiowany z przetrwania do (innych) przestrzeni przeżycia ze względu na młody GC (może to się zdarzyć kilka razy)
  • promowany od przeżycia (lub ewentualnego Eden) do starego miejsca ze względu na młody GC (lub pełne GC)

Rzeczywisty próg dzierżawy jest regulowany dynamicznie za pomocą JVM, ale MaxTenuringThreshold ustawia na nim górny limit.

Jeśli ustawisz MaxTenuringThreshold = 0, wszystkie obiekty zostaną natychmiast awansowane.

Mam few articles o zbieraniu śmieci java, tam można znaleźć więcej szczegółów.

+0

Nie odpowiadasz, jak zmiana wartości 'MaxTenuringThreshold' wpłynie na GC. Co się stanie, jeśli ustawię go na 6? 15? Jaka byłaby różnica? – rustyx

+0

Czy maksymalna (efektywna) wartość parametru "MaxTenuringThreshold" została udokumentowana w dowolnym miejscu? – Mikaveli

12

(Uwaga: ta obejmuje tylko HotSpot VM)

Jak twierdzi Alexey, faktycznie stosowany próg tenuring jest określana przez JVM dynamicznie. Ustawienie jest bardzo małe.W przypadku większości aplikacji wartość domyślna 15 będzie wystarczająco wysoka, ponieważ zazwyczaj więcej obiektów przetrwa kolekcję. Gdy wiele obiektów przetrwa zbiór, przestrzenie ocalałych przelewają się bezpośrednio do starych. Nazywa się to przedwczesną promocją i wskaźnikiem problemu. Jednak rzadko można to rozwiązać przez dostrojenie MaxTenuringThreshold.

W takich przypadkach czasami można użyć SurvivorRatio w celu zwiększenia przestrzeni w pomieszczeniach dla ocalałych, umożliwiając rzeczywistą pracę. Jednak najczęściej powiększanie młodego pokolenia jest jedynym dobrym wyborem (z perspektywy konfiguracji). Jeśli patrzysz z perspektywy kodowania, powinieneś unikać nadmiarowego przydzielania obiektów, aby umożliwić dzierżawienie pracy zgodnie z projektem.

Aby dokładnie odpowiedzieć na pytanie: Gdy obiekt osiągnie swoją maszynę JVM, która określi próg prywatyzacji, zostanie skopiowany do starego. Wcześniej zostanie skopiowany do pustej przestrzeni ocalałej. Przedmioty, które przetrwały jakiś czas, ale są odrzucane przed osiągnięciem progu, są bardzo skutecznie oczyszczane z osób, które przeżyły.

Powiązane problemy