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=200nakazuje 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.0ustawia stertę jako procent pamięci kontenera.-XX:ActiveProcessorCount=Nnadpisuje 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
-Xmxi ewentualnie wyboru kolektora; wartości domyślne są dobre.
Metaspace i wątki
Stos nie jest jedynym obszarem pamięci:
-XX:MaxMetaspaceSizeogranicza przestrzeń na metadane klas; bez tego limitu wyciek podczas ładowania klas może wyczerpać pamięć natywną.-Xssustawia 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/-Xmxwyznaczają 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ństwaHeapDumpOnOutOfMemoryError. - 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
- Identyfikowanie wąskich gardeł
- Java Flight Recorder
- Analiza za pomocą JDK Mission Control
- Typowe opcje dostrajania JVM