JVM -parametrien määrittämiseksi jätealueiden (GC) keskeyttämisen minimoimiseksi on tärkeää ymmärtää erilaisten jätteiden keräilijöiden perustoiminnot ja JVM: ssä saatavilla olevat viritysmekanismit. Konfigurointiprosessiin sisältyy sopivan roskien keräysalgoritmin valitseminen, kasan koon virittäminen, taukoajan tavoitteiden määrittäminen, parametrien kiertäminen ja muistialueiden optimointi. Alla on yksityiskohtainen synteesi JVM -viritystä GC -tautojen minimoimiseksi arvovaltaisten lähteiden ja parhaiden käytäntöjen perusteella:
Oikean roskien keräilijän valitseminen
JVM tarjoaa useita roskien keräysalgoritmeja, joilla jokaisella on erilaiset ominaisuudet läpäisy-, taukoaikojen ja resurssien käyttö:
- Sarja GC: käyttää yhtä säiettä GC: lle. Se pysäyttää kaikki sovelluslankot keräämisen aikana, mikä johtaa pitkiin taukoihin. Se ei yleensä sovellu tautojen minimoimiseen suurempiin sovelluksiin.
- Rinnakkais GC: Käyttää useita säiettä jätteiden keräyksen suorittamiseen vähentämällä taukoaikoja verrattuna sarja GC: hen hyödyntämällä useita CPU -ytimiä. Se on suorituskykykeskeinen, mutta pysähtyy silti sovelluslankoihin GC: n aikana.
- Samanaikainen Mark-Weep (CMS) GC: Suorittaa suuren osan roskien keräystyöstä samanaikaisesti sovelluksen kanssa, vähentämällä merkittävästi taukoaikoja keskeyttämällä sovelluksen vain lyhyesti tietyissä GC-vaiheissa. Se sopii matalan viiveen sovelluksiin.
- roskat ensin (G1) GC: jakaa kasa alueille ja keskittyy alueille eniten roskien kanssa. Sen tavoitteena on tarjota ennustettavissa olevat taukoajat ja hyvän läpimenon sekoittamalla samanaikaiset ja rinnakkaiset vaiheet. Se on usein oletusarvoisia JVM -versioissa.
- Shenandoah ja ZGC: Nämä matalan latenssien keräilijät suorittavat kaikki tai suurin osa GC-työstä samanaikaisesti, tavoitteena hyvin lyhyisiin tai melkein huomaamattomiin taukoihin, jotka sopivat suuriin kasoihin ja erittäin reagoiviin sovelluksiin.
Oikean keräilijän valitseminen riippuu sovellusvaatimuksista, kuten maksimien siedetty taukoaika, kasan koosta ja työmäärän ominaisuuksista.
Kasan koon kokoonpano
Kasan koolla on suora vaikutus GC -taajuuteen ja tauon kestoihin:
-Aseta alku- ja enimmäiskasankoko yhtä suuri: `-XMS` ja` -xmx` käyttäminen samalla arvolla välttää kasankokoon, joka voi ottaa taukoja ajon aikana.
- Riittävä kasakoko: Alijako kasan aiheuttaminen aiheuttaa usein kokoelmia, lisäämällä taukoja. Yli-alliointi johtaa kuitenkin pidempiin GC-sykliin. Löydä saldo sovellusmuistin tarpeiden perusteella.
- Tarkkaile GC -lokeja ja kasan käyttömittareita kasan koon virittämiseksi asianmukaisesti.
GC -taukoajan hallinta
JVM tarjoaa parametreja tavoitteiden asettamiseksi maksimaalisille GC -taukoaikoiksi:
- `-XX: maxgcpausemillis =`: Asettaa tavoite-maksimin taukoajan millisekunnissa keräilijän yrittämiseksi tavata. Vaikka JVM ei ole taattu, se yrittää säätää suorituskykyä ja GC -työtä tämän tauon ylittämisen välttämiseksi.
- Käytä tätä parametria G1 GC: n tai muiden keräilijöiden kanssa, jotka tukevat taukoajan tavoitteita ohjataksesi JVM: n tasapainottamisessa läpimenoaika ja viive.
lanka ja rinnakkaisuus
Useiden säikeiden hyödyntäminen roskien kokoelman aikana vähentää tauon kestoa:
- `-XX: ParallelGCThreads =`: Asettaa GC: n rinnakkaisvaiheissa käytettyjen säikeiden lukumäärän. Lisää kierteitä voi vähentää taukoaikaa, mutta voi myös lisätä prosessorin käyttöä.
- `-XX: ConcgcThreads =`: Samanaikaisten keräilijöiden, kuten CMS ja G1, asettaa samanaikaisia vaiheita suorittavien säikeiden lukumäärän.
- Optimaalisen kierteen määrän tulisi yhdenmukaistaa käytettävissä olevien CPU -ytimien lukumäärän ja työmäärän kanssa; Ylimääräiset langat voivat heikentää suorituskykyä.
nuorten ja vanhojen sukupolvien koon virittäminen
Kasa on tyypillisesti jaettu sukupolvien nuoriin ja vanhaan. Niiden koon virittäminen vaikuttaa GC -käyttäytymiseen:
- Nuoren sukupolven koko: Suurempi nuori sukupolvi vähentää pienten GC: ien taajuutta, mutta lisää pieniä GC -taukoaikoja. Säädä objektin jakamisnopeuden perusteella.
- Vanhan sukupolven koko: Vaikuttaa siihen, kuinka usein merkittävä/täysi GCS juoksee ja niiden kesto.
- G1 GC jakaa kasan moniin yhtä kokoisiin alueisiin ja hallitsee kokoa dynaamisesti, mutta mahdollistaa aloituskynnysten virittämisen parametreilla, kuten `-XX: aloitteilla
Jätelökeräilijäkohtaiset parametrit
G1 GC: lle, jota käytetään yleisesti nykyaikaisissa JVM: ssä:
- `-XX:+Useg1gc`: Ota G1 GC.
- `-XX: maxgcpausemillis =`: taukoaikatavoite.
- `-XX: Aloitteilla,
- `-XX:+USESTRINGEDDEDUPLICATION`: Vähentää muistin jalanjälkiä deduklipaamalla jouset.
- Vältä nimenomaisesti nuoren sukupolven kokoa, koska se voi häiritä G1: n taukoaikatavoitteita.
CMS GC: lle:
- `-XX:+USECONCMARKSWEEPGC`: Ota CMS.
-Viritys keskittyy maailmanlaajuisen pysäytysten keskeyttämiseen säätämällä aloituskynnystä ja säiettä.
Rinnakkaiselle GC: lle (läpäisykeskeinen):
-`-XX:+USEPARALLELGC` ja` -XX:+USEPARALLLOLLOLGC`: OLEAA PALASTUS GC nuorille ja vanhoille sukupolville.
- Viritä GC-säikeiden lukumäärä `-xx: ParallelGcThreads`.
Objektin jakamisnopeuden vähentäminen
Uusien objektien luomisen vähentäminen vähentää GC -painetta:
- Profiili ja optimoi koodi tarpeettoman objektin luomisen minimoimiseksi.
- Käytä esineiden yhdistämistä ja uudelleenkäyttöä, kun mahdollista.
- Säädä JVM -parametreja sisäisen muistin alueiden säätelemiseksi paremman objektin allokointikuvioiden saavuttamiseksi.
Vältä nimenomaisia GC -puheluita
- Poista nimenomaiset GC-puhelut sovelluskoodista tai ulkoisista työkaluista, jotka voivat laukaista täydelliset GC-taukot käyttämällä `-xx:+käytöstä ExplictGC`.
seuranta ja kirjaaminen
Ymmärtääksesi ja virittääksesi GC -käyttäytymisen, ota yksityiskohtainen GC -hakkuut:
- Käytä `-xlog: GC*` JVM: llä, joka tukee yhtenäistä hakkuita (Java 9+).
-Käytä vanhemmissa JVM: issä `-xx:+printgcDetails -xx:+printgcDatEStamps -xloggc:`.
Analysoi lokit tauon syiden tunnistamiseksi ja virittäminen vastaavasti.
Yleiset suositukset
- Aloita virittäminen puhtaalla liuskekivillä poistamalla vanhentuneet JVM -argumentit.
- Testaa muutoksia tuotannon kaltaisessa ympäristössä.
- Käytä työkaluja, kuten Java -lennon tallentin, VisualVM tai kaupalliset profilerit GC: n ja muistin käyttötietojen keräämiseen.
- iteraation viritysvaiheet, jotka perustuvat havaittuihin GC -taukoaikoihin, läpimenoon ja sovellusvasteeseen.
Yhteenvetona voidaan todeta, että JVM -jätealueiden keräysten minimoiminen sisältää asianmukaisen jätealueen kerääjän valitsemisen (mieluiten G1, ZGC tai Shenandoah alhaisten tauon vaatimuksiin), kasan ja sukupolvien asianmukainen kokoaminen, taukoajan tavoitteiden asettaminen, samanaikaisten ketjujen virittäminen, omistusasteen jakamisen määrittäminen, erityisten GCS: n ja huolellisen seurannan käytöstä. Erityiset tiedot riippuvat sovellustyökuormasta, kasan koosta, JVM -versiosta ja laitteistoominaisuuksista. Säädöt tulisi tehdä asteittain ja validoitava valvontatyökaluilla ja yksityiskohtaisilla GC -lokilla halutun läpimenon ja taukoajan tasapainon saavuttamiseksi.
Tämä lähestymistapa varmistaa, että JVM: n roskien keräys toimii tehokkaasti minimaalisilla häiriöillä sovelluksen suorituskykyyn.