För att konfigurera JVM -parametrar för att minimera soporsamling (GC) pauser är det viktigt att förstå de grundläggande operationerna för olika skräppostare och inställningsmekanismerna som finns i JVM. Konfigurationsprocessen innebär att du väljer en lämplig skräppostalgoritm, ställa in högstorlekar, konfigurera paustidsmål, gängningsparametrar och optimera minnesregioner. Nedan följer en detaljerad syntes av JVM -inställning för att minimera GC -pauser baserade på auktoritativa källor och bästa praxis:
Väljer rätt skräpsamlare
JVM erbjuder flera skräpuppsamlingsalgoritmer, var och en med olika egenskaper angående genomströmning, paustider och resursanvändning:
- Seriell GC: använder en enda tråd för GC. Det stoppar alla applikationstrådar under insamling, vilket resulterar i långa pauser. Det är i allmänhet inte lämpligt för att minimera pauser i större applikationer.
- Parallell GC: Använder flera trådar för att utföra skräpuppsamling, vilket minskar paustiderna jämfört med seriell GC genom att utnyttja flera CPU -kärnor. Den är genomströmningsorienterad men pausar fortfarande applikationstrådarna under GC.
- Samtidig Mark-Sweep (CMS) GC: utför mycket av skräpuppsamlingsarbetet samtidigt med applikationen, vilket avsevärt minskar paustiderna genom att endast kort pausa applikationen i specifika GC-faser. Det är lämpligt för applikationer med låg latens.
- Garbage First (G1) GC: delar högen i regioner och fokuserar på att samla regioner med mest skräp först. Det syftar till att ge förutsägbara paustider och god genomströmning genom att blanda samtidiga och parallella faser. Det är ofta standard i moderna JVM -versioner.
- Shenandoah och ZGC: Dessa låg-latenssamlare utför alla eller de flesta GC-arbeten samtidigt och strävar efter mycket korta eller nästan omöjliga pauser, lämpliga för stora högar och mycket lyhörda applikationer.
Att välja rätt samlare beror på applikationskrav som maximal tolererad paustid, högstorlek och arbetsbelastningsegenskaper.
Heap Size Configuration
Högstorlek har en direkt inverkan på GC -frekvens och pausvaraktigheter:
-Ställ in initial och maximal högstorlek lika: att använda `-xms` och` -xmx` med samma värde undviker högst storlek, vilket kan introducera pauser under runtime.
- Tillräcklig högstorlek: Under-allokering av hög orsakar ofta samlingar, vilket ökar pauser. Emellertid leder överfördelningar till längre GC-cykler. Hitta en balans baserad på applikationsminnesbehov.
- Övervaka GC -loggar och höganvändningsmätningar för att ställa in höghögstorlek på lämpligt sätt.
Kontrollera GC Paus Time
JVM tillhandahåller parametrar för att sätta mål för maximala GC -paustider:
- `-xx: maxgcpausemillis =`: Ställer in en mål maximal paustid i millisekunder för att samlaren ska försöka träffas. Även om det inte är garanterat, försöker JVM att justera genomströmning och GC -arbete för att undvika att överskrida denna paustid.
- Använd denna parameter med G1 GC eller andra samlare som stöder paustidsmål för att vägleda JVM i balansering av genomströmning och latens.
Trådning och parallellism
Utnyttjande av flera trådar under skräpsamling minskar pausvarorna:
- `-xx: ParallelGCThreads =`: Ställer in antalet trådar som används under parallella faser av GC. Fler trådar kan minska paustiden men kan också öka CPU -användningen.
- `-xx: concgcThreads =`: För samtidiga samlare som CMS och G1, ställer in antalet trådar som utför samtidiga faser.
- Optimalt trådantal bör anpassa sig till antalet tillgängliga CPU -kärnor och arbetsbelastningen; Överskrivande trådar kan försämra prestanda.
Stämma unga och gamla generationsstorlekar
Högen är vanligtvis uppdelad i generationer unga och gamla. Att ställa in sina storlekar påverkar GC -beteende:
- Ung generationsstorlek: Större ung generation minskar frekvensen av mindre GC men ökar mindre GC -paustider. Justera baserat på objektallokeringsfrekvens.
- Gammal generationsstorlek: påverkar hur ofta större/fulla GC: er körs och deras varaktighet.
- G1 GC delar upp högen i många lika stora regioner och hanterar storlek dynamiskt men tillåter att initieringsgränser med parametrar som `-xx: initiatingHeapoccupancyPercent`.
Skräpuppsamlare specifika parametrar
För G1 GC, vanligtvis används i moderna JVM: er:
- `-xx:+useg1gc`: Aktiverar G1 GC.
- `-xx: maxgcpausemillis =`: paustidsmål.
- `-xx: initiatingHeapOccupancyPercent =`: Börjar samtidig markering när högen når detta beläggning.
- `-xx:+USESTRINGDEDUPLIKATION`: Minskar minnesavtryck genom att deduplikera strängar.
- Undvik att uttryckligen ställa in ung generationens storlek, eftersom det kan störa G1: s paustidsmål.
För CMS GC:
- `-xx:+useconcmarksweepgc`: Aktiverar CMS.
-Stämma fokus på att minska globala stop-the-world pauser genom att justera initieringsgränsen och trådräkningarna.
För parallell GC (genomströmningsorienterad):
-`-xx:+useParallelgc` och` -xx:+useParallelOdgc`: möjliggör parallell GC för unga och gamla generationer.
- Låt antal GC-trådar med `-xx: ParallelGCthreads`.
Minska objektallokeringsfrekvensen
Att minska hastigheten med vilken nya objekt skapas minskar GC -tryck:
- Profil och optimera koden för att minimera onödig skapande av objekt.
- Använd objekt poolning och återanvändning när det är möjligt.
- Justera JVM -parametrar för att reglera interna minnesregioner för bättre objektallokeringsmönster.
Undvik uttryckliga GC -samtal
- Inaktivera explicita GC-samtal från applikationskod eller externa verktyg som kan utlösa fullständiga GC-pauser med `-xx:+inaktiveringsexplicitgc`.
Övervakning och loggning
För att förstå och ställa in GC -beteende, aktivera detaljerad GC -loggning:
- Använd `-xlog: gc*` i JVMS som stöder enhetlig avverkning (Java 9+).
-I äldre JVMS använder du `-xx:+printgcdetails -xx:+printgcdatestamps -xloggc:`.
Analysera loggar för att identifiera pausorsaker och ställa in i enlighet därmed.
Allmänna rekommendationer
- Börja ställa in med en ren skiffer genom att ta bort föråldrade JVM -argument.
- Testförändringar i en produktionsliknande miljö.
- Använd verktyg som Java Flight Recorder, VisualVM eller kommersiella profiler för att samla in GC- och minnesanvändningsdata.
- iterera inställningssteg baserade på observerade GC -paustider, genomströmning och applikationens lyhördhet.
Sammanfattningsvis innebär minimering av JVM -skräpuppsamlingsparer att välja lämplig skräpsamlare (helst G1, ZGC eller Shenandoah för låg pauskrav), korrekt storlekar hög och generationer, sätta paustidsmål, ställa in samtidiga trådar, minimera objektallokeringsfrekvens, inaktivera explicita GCS och noggranna övervakning. Specifikationerna beror på applikationens arbetsbelastning, högstorlek, JVM -version och hårdvaruegenskaper. Justeringar bör göras stegvis och valideras med övervakningsverktyg och detaljerade GC -loggar för att uppnå önskad balans mellan genomströmning och paustid.
Detta tillvägagångssätt säkerställer att JVM: s skräpsamling fungerar effektivt med minimala störningar i applikationsprestanda.