0Pricing
Java Academy · Lekcja

Typowe opcje dostrajania JVM

Opcje sterty, GC i JIT

Typowe opcje dostrajania JVM to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Po co dostrajać JVM?

JVM ma rozsądne ustawienia domyślne, ale w przypadku wymagających usług czasami dostosowuje się rozmiar sterty, kolektor odśmiecania pamięci i działanie JIT.

Dostrajanie to ostateczny krok: najpierw należy profilować i naprawić kod, a dopiero potem sięgać po flagi, gdy pomiary rzeczywiście to uzasadniają.

Rozmiar sterty: -Xms i -Xmx

Dwie najczęściej używane flagi określają granice sterty:

  • -Xms — początkowy rozmiar sterty.
  • -Xmx — maksymalny rozmiar sterty.

Przykład: java -Xms512m -Xmx2g MyApp. Ustawienie -Xms równego -Xmx pozwala uniknąć pauz związanych ze zmianą rozmiaru w długo działających serwerach.

Odczytywanie ustawień domyślnych

Można zapytać JVM, jakie wartości wybrała. Runtime udostępnia bieżące wartości sterty, a -XX:+PrintFlagsFinal wypisuje efektywną wartość każdej flagi.

Przykład wypisuje limity pamięci uruchomionej JVM.

public class Main {
    public static void main(String[] args) {
        Runtime rt = Runtime.getRuntime();
        long mb = 1024 * 1024;
        System.out.println("Max heap (Xmx): " + (rt.maxMemory() / mb) + " MB");
        System.out.println("Total heap now: " + (rt.totalMemory() / mb) + " MB");
        System.out.println("Free in heap: " + (rt.freeMemory() / mb) + " MB");
        System.out.println("Available cores: " + rt.availableProcessors());
    }
}

Wybór kolektora

Nowoczesne JDK oferują kilka kolektorów odśmiecania pamięci:

  • -XX:+UseG1GC — domyślny; zrównoważony, oparty na regionach.
  • -XX:+UseZGC — bardzo krótkie pauzy, duże sterty.
  • -XX:+UseParallelGC — maksymalna przepustowość, dłuższe pauzy.
  • -XX:+UseSerialGC — jednowątkowy, przeznaczony dla małych aplikacji i kontenerów.

Docelowy czas pauzy G1

G1 to kolektor zorientowany na czas pauzy. Podaje mu się cel, a on stara się go osiągnąć:

  • -XX:MaxGCPauseMillis=200 nakazuje G1 utrzymywać pauzy w pobliżu 200 ms.

To miękki cel, a nie gwarancja. Ustawienie go zbyt nisko wymusza częste, małe kolekcje i może pogorszyć przepustowość.

ZGC dla małych opóźnień

Gdy czasy pauz muszą pozostać poniżej milisekundy nawet przy stertach liczących wiele gigabajtów, należy użyć ZGC z opcją -XX:+UseZGC.

Większość pracy wykonuje on współbieżnie z wątkami aplikacji. Ceną jest dodatkowe zużycie CPU i pamięci w porównaniu z G1. To rozwiązanie idealne dla usług wrażliwych na opóźnienia.

Rejestrowanie GC

Aby dostrajać GC, trzeba je widzieć. Proszę włączyć zunifikowane logowanie:

  • -Xlog:gc*:file=gc.log:time,uptime,level,tags

Rejestruje ono każdą kolekcję wraz ze znacznikami czasu i czasem trwania. Przed zmianą jakiejkolwiek flagi należy przekazać log do przeglądarki (lub do JMC/JFR), aby wykryć długie albo częste pauzy.

Kontenery i CPU

W kontenerach JVM odczytuje limity cgroup. Domyślnie przeznacza na stertę ułamek limitu pamięci.

  • -XX:MaxRAMPercentage=75.0 ustawia stertę jako procent pamięci kontenera.
  • -XX:ActiveProcessorCount=N nadpisuje wykrytą liczbę procesorów.

Zapobiega to przydzieleniu większej ilości pamięci, niż może obsłużyć orkiestrator, który w przeciwnym razie zakończyłby proces.

Flagi JIT i diagnostyczne

Jeszcze kilka przydatnych flag:

  • -XX:+HeapDumpOnOutOfMemoryError — zrzut sterty w przypadku OOM na potrzeby analizy po awarii.
  • -XX:HeapDumpPath=/tmp — określa, gdzie go zapisać.
  • -XX:+PrintCompilation — pozwala obserwować aktywność kompilacji JIT.

Ich użycie niewiele kosztuje, a może bardzo pomóc, gdy coś pójdzie nie tak.

Dyscyplina strojenia

Złote zasady dotyczące flag:

  • Zmieniaj jedną flagę naraz i ponownie wykonuj pomiary w porównaniu z wartością bazową.
  • Nie kopiuj flag bezkrytycznie z wpisów na blogach — mogą być przeznaczone dla starszej wersji JVM.
  • Większość aplikacji potrzebuje tylko -Xmx i ewentualnie wyboru kolektora; wartości domyślne są dobre.

Metaspace i wątki

Stos nie jest jedynym obszarem pamięci:

  • -XX:MaxMetaspaceSize ogranicza przestrzeń na metadane klas; bez tego limitu wyciek podczas ładowania klas może wyczerpać pamięć natywną.
  • -Xss ustawia rozmiar stosu przypadający na wątek; należy go zmniejszyć w przypadku uruchamiania bardzo wielu wątków lub zwiększyć przy głębokiej rekurencji.

Te ustawienia rzadko wymagają dostrajania, ale wiedza o ich istnieniu pomaga, gdy problem dotyczy pamięci natywnej, a nie sterty.

Szybkie sprawdzenie

Co kontrolują flagi -Xms i -Xmx?

Podsumowanie

Flagi, które warto znać:

  • -Xms / -Xmx wyznaczają granice sterty.
  • Należy wybrać kolektor: G1 (domyślny), ZGC (krótkie pauzy), Parallel (przepustowość).
  • Dla G1 należy ustawić -XX:MaxGCPauseMillis, a aby obserwować działanie, włączyć -Xlog:gc*.
  • W kontenerach należy używać MaxRAMPercentage, a dla bezpieczeństwa HeapDumpOnOutOfMemoryError.
  • Należy zmieniać jedną flagę naraz i wykonywać pomiary.

Często zadawane pytania

Czy lekcja „Typowe opcje dostrajania JVM” jest bezpłatna?

Tak — pełny tekst „Typowe opcje dostrajania JVM” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Typowe opcje dostrajania JVM”?

Opcje sterty, GC i JIT Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Typowe opcje dostrajania JVM”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Identyfikowanie wąskich gardeł
  2. Java Flight Recorder
  3. Analiza za pomocą JDK Mission Control
  4. Typowe opcje dostrajania JVM
← Powrót do Java Academy