Om JVM -parameters te configureren om pauzes van Garbage Collection (GC) te minimaliseren, is het belangrijk om de fundamentele bewerkingen van verschillende afvalcollectoren en de afstemmingsmechanismen in de JVM te begrijpen. Het configuratieproces omvat het selecteren van een geschikt algoritme voor het verzamelen van afval, het afstemmen van heapgroottes, het configureren van pauzetijddoelen, threadingparameters en het optimaliseren van geheugengebieden. Hieronder is een gedetailleerde synthese van JVM -afstemming voor het minimaliseren van GC -pauzes op basis van gezaghebbende bronnen en best practices:
De juiste vuilnisverzamelaar kiezen
De JVM biedt meerdere algoritmen voor het verzamelen van afval, elk met verschillende kenmerken met betrekking tot doorvoer, pauzetijden en het gebruik van hulpbronnen:
- Serial GC: gebruikt een enkele thread voor GC. Het stopt alle applicatiethreads tijdens het verzamelen, wat resulteert in lange pauzes. Het is over het algemeen niet geschikt voor het minimaliseren van pauzes in grotere toepassingen.
- Parallel GC: maakt gebruik van meerdere threads om afvalinzameling uit te voeren, pauzetijden te verminderen in vergelijking met seriële GC door gebruik te maken van meerdere CPU -kernen. Het is doorvo-georiënteerd maar pauzeert nog steeds de applicatiethreads tijdens GC.
- Gelijktijdige Mark-Sweep (CMS) GC: voert veel van het afvalinzamelingswerk gelijktijdig uit met de toepassing, waardoor de pauzeren aanzienlijk worden verkleind door de toepassing slechts kort te pauzeren in specifieke GC-fasen. Het is geschikt voor toepassingen met lage latentie.
- Garbage First (G1) GC: verdeelt de hoop in regio's en richt zich op het verzamelen van regio's met de meeste afval eerst. Het is bedoeld om voorspelbare pauzetijden en goede doorvoer te bieden door gelijktijdige en parallelle fasen te mengen. Het is vaak de standaardinstelling in moderne JVM -versies.
- Shenandoah en ZGC: deze verzamelaars met lage latentie voeren alle of de meeste GC-werk gelijktijdig uit, gericht op zeer korte of bijna onmerkbare pauzes, geschikt voor grote hopen en zeer responsieve toepassingen.
Het kiezen van de juiste verzamelaar is afhankelijk van toepassingsvereisten, zoals maximaal getolereerde pauzetijd, heapgrootte en werklastkenmerken.
heap maat configuratie
HEAP -grootte heeft een directe invloed op de GC -frequentie en pauzeerduur:
-Stel de initiële en maximale heapgrootte gelijk in: het gebruik van `-xms` en` -xmx` met dezelfde waarde vermijdt heap-formaat, wat pauzes tijdens runtime kan introduceren.
- Adequate heapgrootte: onder toewijzing van heap veroorzaakt frequente collecties, toenemende pauzes. Overlacerende leidt echter tot langere GC-cycli. Zoek een balans op basis van de behoeften van de applicatie -geheugen.
- Monitor GC -logboeken en heap -gebruiksstatistieken om de heapgrootte op de juiste manier af te stemmen.
GC -pauzetijd besturen
De JVM biedt parameters om doelen te stellen voor maximale GC -pauzetijden:
- `-xx: maxgcpausemillis =`: stelt een doelmaximale pauzetijd in milliseconden in voor de verzamelaar om te ontmoeten. Hoewel niet gegarandeerd, probeert de JVM de doorvoer en GC aan te passen om te voorkomen dat deze pauzetijd wordt overschreden.
- Gebruik deze parameter met G1 GC of andere verzamelaars die pauzetijddoelen ondersteunen om de JVM te begeleiden bij het balanceren van doorvoer en latentie.
Threading en parallellisme
Het gebruik van meerdere draden tijdens het verzamelen van afval vermindert de duur van de pauze:
- `-xx: parallelgcthreads =`: stelt het aantal threads in dat wordt gebruikt tijdens parallelle fasen van GC. Meer draden kunnen de pauzetijd verkorten, maar kunnen ook het CPU -gebruik verhogen.
- `-xx: concgcthreads =`: voor gelijktijdige verzamelaars zoals CMS en G1 stelt het aantal threads in dat gelijktijdige fasen uitvoert.
- Optimale threadtelling moet aansluiten bij het aantal beschikbare CPU -kernen en de werklast; Oversubschrijvende draden kunnen de prestaties verslechteren.
Tuning jonge en oude generatie maten
Heap is meestal verdeeld in generaties jong en oud. Het afstemmen van hun maten beïnvloedt GC -gedrag:
- Grootte van de jonge generatie: grotere jonge generatie vermindert de frequentie van kleine GC's maar verhoogt kleine GC -pauzetijden. Aanpassen op basis van objecttoewijzingspercentage.
- Oude generatie Grootte: beïnvloedt hoe vaak grote/volledige GC's worden uitgevoerd en hun duur.
- G1 GC verdeelt de hoop in vele gelijktijdige regio's en beheert de grootte dynamisch, maar maakt het mogelijk om initiatiedrempels af te stemmen met parameters zoals `-xx: initiërenheapoccupancypercent '.
Garbage Collector Specifieke parameters
Voor G1 GC, vaak gebruikt in moderne JVM's:
- `-xx:+USEG1GC`: schakelt G1 GC in.
- `-xx: maxgcpausemillis =`: pauze tijddoel.
- `-xx: initiërenheapoccupancypercent =`: begint gelijktijdig markeren wanneer de hoop deze bezetting bereikt.
- `-xx:+usestringDeduplication`: vermindert geheugenvoetafdruk door deduplicerende strings.
- Vermijd expliciet instellen van de grootte van de jonge generatie, omdat dit de pauzetijddoelen van G1 kan verstoren.
Voor CMS GC:
- `-xx:+useconcmarksweepgc`: schakelt cms in.
-Tuning focus op het verminderen van globale stop-the-world pauzes door de initiatiedrempel en draadtellingen aan te passen.
Voor parallelle GC (doorvoergericht):
-`-xx:+useParallelgc` en` -xx:+useParalleloldgc`: maakt parallelle GC mogelijk voor jonge en oude generaties.
- Tune Aantal GC-threads met `-xx: parallelgcthreads`.
Vermindering van het objecttoewijzingspercentage
Het verlagen van de snelheid waarmee nieuwe objecten worden gemaakt, vermindert GC -druk:
- Profiel en optimaliseer de code om onnodige objectcreatie te minimaliseren.
- Gebruik objectpooling en hergebruik indien mogelijk.
- Pas JVM -parameters aan om interne geheugengebieden te reguleren voor betere objectallocatiepatronen.
Vermijd expliciete GC -oproepen
- Schakel expliciete GC-oproepen uit van applicatiecode of externe tools die volledige GC-pauzes kunnen activeren met behulp van `-xx:+disableExplicitGC`.
Monitoring en logboekregistratie
Om GC -gedrag te begrijpen en af te stemmen, kunt u gedetailleerde GC -logboekregistratie inschakelen:
- Gebruik `-xlog: GC*` in JVMS die Unified Logging ondersteunt (Java 9+).
-Gebruik in oudere JVM's `-xx:+printgcdetails -xx:+printgcdatestamps -xloggc:`.
Analyseer logboeken om pauze oorzaken te identificeren en dienovereenkomstig af te stemmen.
Algemene aanbevelingen
- Begin met afstemmen met een schone lei door verouderde JVM -argumenten te verwijderen.
- Test veranderingen in een productieachtige omgeving.
- Gebruik tools zoals Java Flight Recorder, VisualVM of commerciële profilers om GC- en geheugengebruiksgegevens te verzamelen.
- Resereren afstemmingsstappen op basis van waargenomen GC -pauzetijden, doorvoer en applicatie -responsiviteit.
Samenvattend omvat het minimaliseren van JVM -afvalinzamelingspauzes het selecteren van de juiste afvalverzamelaar (bij voorkeur G1, ZGC of Shenandoah voor lage pauzevereisten), de juiste afmetingen van heap en generaties, het instellen van pauzetijddoelen, het afstemmen van concurrency -threads, minimaliseren van objecten toewijzingspercentage, expliciete GC's en zorgvuldige monitoring. De details zijn afhankelijk van de applicatie -werklast, heapgrootte, JVM -versie en hardware -kenmerken. Aanpassingen moeten stapsgewijs worden aangebracht en worden gevalideerd met monitoringtools en gedetailleerde GC -logboeken om de gewenste balans tussen doorvoer te bereiken en tijd te pauzeren.
Deze aanpak zorgt ervoor dat de afvalcollectie van de JVM efficiënt werkt met minimale verstoringen van de toepassingsprestaties.