Java Academy · Lektion

Vanliga JVM-flaggar för finjustering

Heap-, GC- och JIT-alternativ.

Lektion 4 av 413 steg

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=200 ber 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.0 anger 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 -Xmx och kanske ett val av garbage collector; standardinställningarna är bra.

Metaspace och trådar

Heapen är inte det enda minnesområdet:

  • -XX:MaxMetaspaceSize begränsar utrymmet för klassmetadata; utan den kan en läcka vid klassinläsning tömma det inbyggda minnet.
  • -Xss anger 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 / -Xmx anger heapens gränser.
  • Välj en garbage collector: G1 (standard), ZGC (korta pauser), Parallel (genomströmning).
  • Ange -XX:MaxGCPauseMillis för G1 och aktivera -Xlog:gc* för att övervaka.
  • Använd MaxRAMPercentage i containrar och HeapDumpOnOutOfMemoryError som säkerhetsåtgärd.
  • Ändra en flagga i taget och mät.
Gratis att börja

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

  1. Identifiera flaskhalsar
  2. Java Flight Recorder
  3. Analysera med JDK Mission Control
  4. Vanliga JVM-flaggar för finjustering
← Tillbaka till Java Academy