2011-07-29 9 views
32

Prawie każdy w końcu napotyka problemy GC z Javą.Czy istnieje przewodnik po książkach kucharskich na temat problemów z GC?

Czy istnieje przewodnik kucharski lub półautomatyczne narzędzie do regulacji GC dla Java?

Moje uzasadnienie jest takie:

  • Prawie każdy w końcu musi te problemy
  • Istnieje wiele możliwych czynników (powiedzmy 20), z czego tylko kilka wpływu na problem.
  • Większość ludzi nie wie, jak zidentyfikować kluczowe czynniki, więc tuning GC jest bardziej jak czarna sztuka niż nauka.
  • Nie każdy korzysta z maszyny wirtualnej HotSpot. Różne wersje Sun mają różne charakterystyki GC.
  • Istnieje niewielka zachęta do eksperymentowania (np. Uruchamiać maszynę wirtualną z nieco innymi ustawieniami każdego dnia, aby zobaczyć, jak grają).

Tak naprawdę pytanie brzmi: Czy jest coś, co mogę wykorzystać w sposób sprawdzający? A może nawet narzędzie, które analizuje dzienniki GC lub zrzuty sterty i daje mi konkretne wskazówki, gdzie szukać (zamiast powiedzieć mi "95% danych jest przydzielonych w obiektach typu bajt []", co jest w zasadzie bezużyteczne).

Powiązane pytania:

+2

GC analizuje się i dostraja wiele parametrów, które można ustawić w inny sposób. Jeśli chcesz, aby GC dostroił się automatycznie, utrzymaj parametry GC na minimalnym poziomie. Jeśli musisz określić parametry, są to te, które będą specjalizować się w twoim przypadku i będą trudne do określenia automatycznie. –

+0

Nigdy nie stworzyłem sobie listy kontrolnej, ponieważ pierwszą rzeczą, którą należy zrobić, jest: • Istnieje wiele motywacji do eksperymentowania (np. Uruchamianie VM z nieco innymi ustawieniami każdego dnia, aby zobaczyć, jak grają); D Bardzo często najprostszy soluton jest po to, aby adjsut pamięć ustabilizowała się trochę i zrobiłaś. –

+0

@Peter: Czy istnieje sposób na zapisanie tych parametrów jako pewnego rodzaju "punktu początkowego", aby nie trzeba było wykonywać zadań po każdym uruchomieniu? A może przynajmniej na nich spojrzeć? –

Odpowiedz

14

Odniesienia do poszczególnych danych GW:

Oracle

Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine

co również

Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning

IBM

Fine Tuning Garbage Collection [link martwy]

Extensible Verbose Toolkit

SAP JVM

Memory Management (Garbage Collection)

Detecting Memory Leaks

Detecting Hanging/Looping VMs

Analyzing Out-of-Memory Situations

Niestety nie wiem zbyt wiele na temat SAP, ale dostarczyłem kilka rzeczy, które znalazłem.

Jeśli chodzi o książkę kucharską, strojenie jest najprawdopodobniej specyficzne dla aplikacji na tym poziomie, ale jest to ciekawy temat.

DODATEK

wspomniano także narzędzi analitycznych. Niektórzy kandydaci są wymienione tutaj:

Know of any Java garbage collection log analysis tools?

+0

Dzięki za wysiłek, ale to tylko dla HotSpot. A co z maszynami wirtualnymi Java od SAP i IBM? –

+0

Dodałem więcej do tej odpowiedzi. Nie jestem pewien na temat SAP Zawsze myślałem, że to opakowanie dla Sun JVM. – Merlin

+0

+1 za wysiłek. Poczekam kilka dni, zanim przyjmiemy go w szczupłej nadziei, że ktoś ma coś, co lepiej pasuje do mojej listy życzeń :-) –

18

Spośród różnych zasobów Mam przygotował listę kontrolną testow, które mogę używać do analizy zachowań GC i skuteczność moich zastosowań. Te wskazówki mają ogólne znaczenie: i mają zastosowanie do dowolnej maszyny JVM określonej przez producenta, ale zawierają również informacje specyficzne dla HotspotVM w celach ilustracyjnych.

  1. Wyłącz Wyraźne GC. Wyraźny GC to zła praktyka kodowania, nigdy nie pomaga. Użyj -XX:+DisableExplicitGC.

  2. Włącz pełne rejestrowanie GC. Lekki, ale mocny.

    • Compute żywo Data Set, Alokacja Oceń i Promocja Oceń. Dzięki temu dowiesz się, czy potrzebujesz większego sterty, czy też np. Młody Gen jest za mały lub jeśli Twoje przestrzenie Bohaterów są przepełnione itd.
    • Obliczyć całkowity czas GC, powinno być < 5% całkowitego czasu pracy.
    • Zastosowanie -XX:+PrintTenuringDistribution -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion
  3. rozważyć dodatkowe środki gromadzenia informacji na temat GC. Logowanie jest w porządku, ale czasami dostępne są lekkie narzędzia wiersza polecenia, które zapewniają jeszcze więcej wglądu. Na przykład. jstat do Hotspot, która pokaże zawód/pojemność Eden, Survivor i Starego Gen.

  4. Collect Class histogramy Są lightweigh i pokaże zawartość sterty. Można robić zdjęcia, kiedy tylko zauważy jakąś dziwną aktywność GC, czy można wziąć je przed/po pełnym GC:

    • zawartość przestrzeni OldGen: można dowiedzieć się, jakie obiekty znajdują się w OldGen. Musisz wydrukować histogramy przed i po Full GC. A ponieważ kolekcja YoungGen jest wykonywana przed pełnym GC, te Histogramy pokażą ci zawartość Starego pokolenia. Użyj -XX:+PrintClassHistogramBeforeFullGC -XX:+PrintClassHistogramAfterFullGC.
    • Wykrywanie przedwcześnie promowane obiekty: Aby ustalić, czy wszelkie przypadki są promowane na początku, trzeba uczyć się histogramy, aby zobaczyć, które oczekuje się zajęcia przebywać w OldGen i które klasy powinny być postrzegane tylko w YoungGen. Nie można tego zrobić automatycznie, musisz uzasadnić cel każdej klasy i jej instancji, aby określić, czy obiekt jest tymczasowy, czy nie.
  5. Rozważ inny algorytm GC. Maszyny wirtualne zwykle są dostarczane z kilkoma różnymi implementacjami GC, które zapewniają różne kompromisy: przepustowość, zasięg, wstrzymywanie/krótkie przerwy, czas rzeczywisty itd. Rozważ dostępne opcje i wybierz to, które spełnia twoje potrzeby.

  6. Uwaga na finalizację(). Sprawdź, czy GC nadąża za klasami używając finalize(). Wykonanie tej metody może być dość kosztowne, co może mieć wpływ na GC i przepustowość aplikacji.

  7. Wysypisko sterty. To jest pierwszy krok, który jest ciężki i wpłynie na uruchomioną aplikację. Zbierz stertę, aby dokładniej zbadać zawartość sterty lub potwierdzić hipotezę zaobserwowaną w kroku 4.

zasoby używane:

Książki:

rozmów/Artykuły:

listach mailowych:

Powiązane problemy