Vanliga JVM-flaggar för finjustering
Heap-, GC- och JIT-alternativ.
Vanliga JVM-flaggar för finjustering är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 4 lektioner.
Varför finjustera JVM?
JVM har rimliga standardinställningar, men för krävande tjänster kan Ni ibland justera heapstorlek, garbage collector och JIT-beteende.
Finjustering är det sista steget: profilera först, åtgärda koden och använd sedan flaggor först när mätningarna motiverar det.
Heapstorlek: -Xms och -Xmx
De två vanligaste flaggorna anger heapens gränser:
-Xms— initial heapstorlek.-Xmx— maximal heapstorlek.
Exempel: java -Xms512m -Xmx2g MyApp. Om -Xms sätts till samma värde som -Xmx undviker Ni pauser vid storleksändringar i långkörande servrar.
Läsa standardvärdena
Ni kan fråga JVM vad den valde. Runtime visar de aktuella heapvärdena, och -XX:+PrintFlagsFinal skriver ut varje flags effektiva värde.
Exemplet skriver ut minnesgränserna för den JVM-instans som körs.
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());
}
}Välja garbage collector
Moderna JDK:er erbjuder flera garbage collectors:
-XX:+UseG1GC— standardalternativet; balanserad och regionbaserad.-XX:+UseZGC— extremt korta pauser, stora heapar.-XX:+UseParallelGC— maximal genomströmning, längre pauser.-XX:+UseSerialGC— entrådad, för små appar och containrar.
G1:s pausmål
G1 är en paustidsorienterad garbage collector. Ni anger ett mål som den försöker uppnå:
-XX:MaxGCPauseMillis=200ber G1 hålla pauserna nära 200 ms.
Det är ett mjukt mål, inte en garanti. Om det sätts för lågt tvingas G1 att göra frekventa små insamlingar, vilket kan försämra genomströmningen.
ZGC för låg latens
När paustiderna måste hållas under en millisekund även för heapar på flera gigabyte använder Ni ZGC med -XX:+UseZGC.
Den utför det mesta av sitt arbete samtidigt som applikationens trådar körs. Nackdelen är något högre CPU- och minneskostnad jämfört med G1. Det är idealiskt för latenskänsliga tjänster.
GC-loggning
För att finjustera GC måste Ni kunna se vad som händer. Aktivera enhetlig loggning:
-Xlog:gc*:file=gc.log:time,uptime,level,tags
Detta registrerar varje insamling med tidsstämplar och varaktigheter. Läs in loggen i ett visningsverktyg (eller JMC/JFR) för att hitta långa eller frekventa pauser innan Ni ändrar någon flagga.
Containrar och CPU
I containrar läser JVM cgroup-gränserna. Som standard använder den en andel av minnesgränsen för heapen.
-XX:MaxRAMPercentage=75.0anger heapen som en procentandel av containerns minne.-XX:ActiveProcessorCount=Nåsidosätter det upptäckta antalet CPU:er.
Detta förhindrar att minne överallokeras så att orkestreraren därefter avslutar processen.
JIT- och diagnostikflaggor
Några fler användbara flaggor:
-XX:+HeapDumpOnOutOfMemoryError— dumpar heapen vid OOM för analys i efterhand.-XX:HeapDumpPath=/tmp— anger var dumpen ska skrivas.-XX:+PrintCompilation— visar JIT-kompileringsaktivitet.
De kostar lite och lönar sig när något går fel.
Disciplin vid optimering
Grundregler för flaggor:
- Ändra en flagga i taget och mät på nytt mot en baslinje.
- Kopiera inte flaggor blint från blogginlägg — de kan vara avsedda för en äldre JVM.
- De flesta appar behöver bara
-Xmxoch kanske ett val av garbage collector; standardinställningarna är bra.
Metaspace och trådar
Heapen är inte det enda minnesområdet:
-XX:MaxMetaspaceSizebegränsar utrymmet för klassmetadata; utan den kan en läcka vid klassinläsning tömma det inbyggda minnet.-Xssanger stackstorleken per tråd; sänk den om du kör mycket stora mängder trådar och höj den vid djup rekursion.
De här inställningarna behöver sällan finjusteras, men om du vet att de finns blir det lättare att felsöka när problemet gäller native-minne i stället för heapen.
Snabbkontroll
Vad styr flaggorna -Xms och -Xmx?
Sammanfattning
Flaggorna som är värda att känna till:
-Xms/-Xmxanger heapens gränser.- Välj en garbage collector: G1 (standard), ZGC (korta pauser), Parallel (genomströmning).
- Ange
-XX:MaxGCPauseMillisför G1 och aktivera-Xlog:gc*för att övervaka. - Använd
MaxRAMPercentagei containrar ochHeapDumpOnOutOfMemoryErrorsom säkerhetsåtgärd. - Ändra en flagga i taget och mät.
Lär dig Java med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 104
- Lektioner
- 374
Vanliga frågor
Är lektionen ”Vanliga JVM-flaggar för finjustering” gratis?
Ja – hela texten till ”Vanliga JVM-flaggar för finjustering” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Vanliga JVM-flaggar för finjustering”?
Heap-, GC- och JIT-alternativ. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Java Academy?
Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Vanliga JVM-flaggar för finjustering”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Java Academy-lektionen?
Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Identifiera flaskhalsar
- Java Flight Recorder
- Analysera med JDK Mission Control
- Vanliga JVM-flaggar för finjustering