Teknologian jakaminen

[JVM Basics] Johdatus Java Garbage Collectoriin

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Roskakeräys (roskankeräysalgoritmin toteutus)

Roskankerääjä on jätteenkeräysalgoritmin erityinen toteutus . Koska roskankerääjä on jaettu nuoreen ja vanhaan sukupolveen, G1:n lisäksi (joka voi ohjata sekä uutta että vanhaa sukupolvea),Uuden sukupolven ja vanhan sukupolven jäteastioita tulee käyttää pareittain hotspotin vaatimusten mukaisesti.(Sinun on valittava vastaava yhdistelmä JDK-version mukaan)

Erityinen yhdistelmäsuhde on seuraava:

Lisää kuvan kuvaus tähän

JVM:n taustalla olevassa lähdekoodissa CMS-kierrättäjä kutsuu joissakin erikoistapauksissa Serial Old -kierrättäjää.

Artha näkee käytetyn roskakoriin

Et voi suoraan nähdä, mitä roskakoria käytetään, voit päätellä sen vain algoritmin perusteella.

Lisää kuvan kuvaus tähän

Nuoren sukupolven sarjajätteenkerääjä

Sarja on aNuoren sukupolven yksisäikeinen sarjakokoelmaJätteen kerääjä.

Lisää kuvan kuvaus tähän

Kierrätyksen iät ja algoritmit

  • nuori sukupolvi
  • Replikointialgoritmi

etu

Erinomainen suorituskyky yhdellä prosessorilla

puute

Suorituskyky monen CPU:n alla ei ole yhtä hyvä kuin muilla roskakeräilijöillä (yksisäikeinen, vain yhtä CPU:ta käyttävä), jos kasa on liian suuri, käyttäjäsäie odottaa pitkään.

Sovellettava kohtaus

Java-kielellä kirjoitetut asiakasohjelmat tai skenaariot, joissa on rajoitettu laitteistokokoonpano (ei montaa suorittimen ydintä)

kuinka käyttää

-XX: UseSerialGC: Sekä uusi että vanha sukupolvi käyttävät sarjakerääjää.

Vanha sukupolvi-SerialVanha roskakori

SerialOld on Serial roskakeräimen vanhan sukupolven versio, joka käyttääYksisäikeinen sarjakokoelma

Lisää kuvan kuvaus tähän

Kierrätyksen iät ja algoritmit

  • vanhuus
  • Merkintälajittelualgoritmi

etu

Erinomainen suorituskyky yhdellä prosessorilla

puute

Multi-CPU:n läpimenokyky ei ole yhtä hyvä kuin muilla roskakeräilijöillä. Jos kasa on liian suuri, käyttäjäsäie odottaa pitkään.

Sovellettava kohtaus

Käytetään Serial roskakeräimen kanssa tai CMS:n erikoistapauksissa

kuinka käyttää

-XX: UseSerialGC: Sekä uusi että vanha sukupolvi käyttävät sarjakerääjää.

Nuori sukupolvi-ParNew roskakori

ParNew-jätteenkerääjä on pohjimmiltaanSerial-optimointi useiden prosessorien alla, käyttämällä monisäikeistystä roskien keräämiseen

Lisää kuvan kuvaus tähän

Kierrätysikä ja -algoritmi:

  • nuori sukupolvi
  • Replikointialgoritmi

etu

  • Lyhyemmät taukoajat usean suorittimen kanssa

puute

  • Suorituskyky ja taukoaika eivät ole yhtä hyviä kuin G1, joten sitä ei suositella JDK9:n jälkeen

Sovellettava kohtaus

  • JDK8:ssa ja aiemmissa versioissa sitä käytetään yhdessä CMS:n vanhan sukupolven roskakeräimen kanssa.

kuinka käyttää

  • -XX: UseParNewGC: Uusi sukupolvi käyttää ParNew-keräilijää ja vanha sukupolvi sarjakerääjää.

Lisää kuvan kuvaus tähän

Vanhan sukupolven CMS (Concurrent Mark Sweep) roskakori

CMS-jätteenkeräin keskittyy järjestelmän taukoaikaan (minimoimaan STW:n ja optimoimaan käyttökokemuksen),Salli käyttäjäsäikeiden ja roskienkeräyssäikeiden suorittaa samanaikaisesti tietyissä vaiheissa, mikä vähentää käyttäjäsäikeiden odotusaikaa.

Kierrätyksen iät ja algoritmit

  • vanhuus
  • Merkitse ja pyyhkäisy -algoritmi

etu

  • Jätteenkeräyksestä johtuva järjestelmän taukoaika on lyhyempi ja käyttökokemus parempi.

puute

1. Muistin pirstoutumisongelma

2. Hajoamisongelma (joissakin erityistapauksissa se rappeutuu yksisäikeiseksi kerääjäksi, kuten SerialOld)

3. Kelluva roskaongelma (jotakin roskaa ei voida kierrättää kierrätysprosessin aikana)

Sovellettava kohtaus

Skenaariot suurissa Internet-järjestelmissä, joissa käyttäjät vaativat suuria tietomääriä ja korkeaa taajuutta, kuten tilausrajapinnat, tuoterajapinnat jne.

käyttää

XX: UseConcMarkSweepGC, voit asettaa nuoren ja vanhan sukupolven keräilijät.

Lisää kuvan kuvaus tähän

Lisää kuvan kuvaus tähän

CMS:n suoritusvaiheet

  1. Ensimmäinen merkintä, merkintä erittäin lyhyessä ajassaObjektit, joihin GC Roots voi liittyä suoraan
  2. samanaikainen merkintä, Merkitse kaikki objektit , käyttäjän säiettä ei tarvitse keskeyttää. (Vaikka samanaikainen merkintä suoritetaan yhdessä käyttäjäsäikeen kanssa, jos samanaikaisen merkinnän käyttämät resurssit ovat korkeat, se vaikuttaa myös käyttäjäsäieteen)
  3. Remarking (samanaikaisuus), koska jotkin kohteet muuttuvat samanaikaisen merkintävaiheen aikana, esiintyy virheellisiä merkintöjä (käytetty objekti oli alun perin elossa, mutta merkinnän jälkeen käyttäjälanka teki siitä käyttökelvottoman, mikä johti väärään merkintään), puuttuu merkintä ( koska se on samanaikainen, jotkin objektit ovat saattaneet juuri luoda käyttäjäsäie, mikä johtaa puuttuviin tageihin) ja muissa tilanteissa, ja ne on merkittävä uudelleen.
  4. Samanaikainen puhdistus, kuolleiden kohteiden puhdistaminen, käyttäjäsäikeitä ei tarvitse keskeyttää.

Huomautus: STW tulee näkyviin vain alkumerkintä- ja uudelleenmerkintävaiheiden aikana.

Lisää kuvan kuvaus tähän

puute:

1. CMS käyttää merkin ja tyhjennyksen algoritmia.CMS eheytyy Full GC:n aikana. . Tämä saa käyttäjäketjun keskeyttämään,Voit käyttää -XX:CMSFullGCsBeforeCompaction=N-parametria (oletusarvo 0) säätääksesi Full GC N kertaa ennen sen lajittelua.

2. Ei pysty käsittelemään samanaikaisen siivousprosessin aikana syntyvää "kelluvaa roskaa", eikä täydellistä roskien keräämistä (tämän puhdistusprosessin aikana käyttäjäsäie loi samanaikaisesti joitain objekteja, mutta niitä ei käytetty pian uudelleen. Näitä objekteja se ei ole kierrätetään tässä siivouksessa ja sen on odotettava seuraavaan siivoukseen asti, joten sitä kutsutaan kelluvaksi roskiksi).

3. Jos vanhassa sukupolvessa ei ole tarpeeksi muistia objektien allokoimiseen, CMS muuttuu Serial Old -yksisäikeiseksi kierrättäen vanhaa sukupolvea.

Samanaikaisten säikeiden lukumäärä:

Säikeiden määrä ajettaessa samanaikaista vaihetta CMS:ssä voidaan siirtää-XX:ConcGCThreadsJärjestelmä laskee parametriasetukset, ja laskentakaava on:(-XX:ParallelGCThreads定义的线程数 3) / 4, ParallelGCThreads on rinnakkaisten säikeiden määrä STW-tauon jälkeen

ParallelGCThreads määräytyy prosessoriytimien lukumäärän mukaan:

1. Kun suorittimen ytimien määrä on alle 8, ParallelGCThreads = CPU-ytimien määrä

2. Muuten ParallelGCThreads = 8 (CPU-ytimien määrä – 8)*5/8

Tietokoneessani on 12 loogista prosessoria, joten ParallelGCThreads = 8 (12 - 8) * 5/8 = 10, ConcGCThreads = (-XX: ParallelGCThreads 3:n määrittämien säikeiden määrä) / 4 = (10 3) / 4 = 3

Lisää kuvan kuvaus tähän

Lopulta saat tämän kuvan:

Lisää kuvan kuvaus tähän

Samanaikainen merkintä- ja samanaikainen puhdistusvaihe käsitellään rinnakkain kolmella kierteellä. Uudelleenmerkintävaihe käsitellään 10 säikeellä. Koska suorittimen ytimien määrä on rajoitettu, samanaikainen vaihe vaikuttaa käyttäjäsäikeen suoritustehoon.

Lisää kuvan kuvaus tähän

Nuoren sukupolven rinnakkaisraivausjätteenkerääjä

Parallel Scavenge onJDK8 oletusarvoinen nuoren sukupolven roskakori,MonisäikeinenRinnakkaiskokoelmaKeskity järjestelmän suorituskykyyn .Suorituskyvyn lisäämiseksi PS tekeeSäädä kasan muistin kokoa automaattisesti (säädä uuden sukupolven, vanhan sukupolven muistin kokoa, edistämiskynnystä)

Lisää kuvan kuvaus tähän

Kierrätyksen iät ja algoritmit

  • nuori sukupolvi
  • Replikointialgoritmi

etu

  • Suorituskyky on korkea, ja se tukee manuaalista parametrien asetusta suorituskyvyn ohjaamiseksi. Suorituskyvyn parantamiseksi virtuaalikone säätää dynaamisesti keon parametreja (käyttäjän tarvitsee vain asettaa suoritusteho, eikä hänen tarvitse asettaa muita parametreja, kuten muistin kokoa).

puute

  • Yhdestä taukoajasta ei ole takeita, mutta se tukee STW-ajan asettamista.

Sovellettava kohtaus

  • Taustatehtävät eivät vaadi käyttäjän vuorovaikutusta ja luovat yleensä suuren määrän objekteja.Esimerkiksi: ison tiedon käsittely, suurten tiedostojen vienti

Yleiset parametrit

Parallel Scavenge mahdollistaa suurimman taukoajan ja suorituskyvyn manuaalisen asettamisen. Oracle-virkailijat suosittelevat, että keon enimmäismuistia ei aseteta tätä yhdistelmää käytettäessä. Roskankerääjä säätää muistin kokoa automaattisesti enimmäistaukoajan ja suorituskyvyn perusteella.

  • suurin taukoaika,-XX:MaxGCPauseMillis=n Aseta millisekuntien enimmäismäärä keskeytettäväksi jokaiselle roskakeräykselle
  • läpimeno,-XX:GCTimeRatio=n Aseta suorituskyvyksi n (käyttäjäsäikeen suoritusaika = n/(n 1))
  • Säädä muistin kokoa automaattisesti, -XX: UseAdaptiveSizePolicyAsetus sallii roskakeräimen säätää automaattisesti muistin kokoa suorituskyvyn ja maksimitaukomillisekuntien perusteella. Tämä parametri on oletuksena käytössä (Oracle suosittelee, että PS-yhdistelmää käytettäessä ei määritetä enimmäismuistia ja anna roskakeräimen säätää automaattisesti).

Huomautus: Kaksi enimmäistaukoajan ja suorituskyvyn ilmaisinta ovat ristiriidassa Roskienkeräin yrittää parhaansa noudattaa enimmäistaukoaikaa (joskus se on asetettu liian pieneksi, eikä sitä voida saavuttaa, ja asetettu enimmäistaukoaika ylittyy). , uhraten suorituskyvyn.Jos haluat asettaa enimmäistaukoajan ja suorituskyvyn samaan aikaan, sinun on tehtävä enemmän testejä koordinoidaksesi niitä.

Vanha sukupolvi-Rinnakkais Vanha roskakori

Parallel Old on vanhan sukupolven versio, joka on suunniteltu Parallel Scavenge -keräilijälle, joka hyödyntää monisäikeistä samanaikaista keräämistä.

Lisää kuvan kuvaus tähän

Kierrätyksen iät ja algoritmit

  • vanhuus
  • Merkitse ja lajittele -algoritmi (itse asiassa merkitse ja pyyhkäise -lajittelu)

etu

  • Samanaikainen kerääminen on tehokkaampaa moniytimisissä prosessoreissa

puute

  • Taukoaika on pidempi

Sovellettava kohtaus

  • Käytetään Parallel Scavengen kanssa

kuinka käyttää

JDK8 asettaa parametrit tämän kierrättimen käyttöä varten oletuksena.

parametri:-XX: UseParallelGC tai-XX: UseParallelOldGCVoit käyttää yhdistelmää Parallel Scavenge Parallel Old.
Lisää kuvan kuvaus tähän

Lisää kuvan kuvaus tähän

testata

-XX: PrintFlagsFinal: Voit tulostaa kaikkien asetusten lopulliset arvot ohjelman käynnistyessä. Voit tarkistaa, onko automaattinen säätötoiminto päällä.

Lisää kuvan kuvaus tähän

Lisää kuvan kuvaus tähän

Lisää kuvan kuvaus tähän

Lisää kuvan kuvaus tähän

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 垃圾回收器案例3
 */
//-XX: UseSerialGC -Xmn1g -Xmx16g -XX:SurvivorRatio=8  -XX: PrintGCDetails -verbose:gc -XX: PrintFlagsFinal
//-XX: UseParNewGC  -Xmn1g -Xmx16g -XX:SurvivorRatio=8  -XX: PrintGCDetails -verbose:gc
//-XX: UseConcMarkSweepGC
//-XX: UseG1GC   -Xmn8g -Xmx16g -XX:SurvivorRatio=8  -XX: PrintGCDetails -verbose:gc MaxGCPauseMillis
//-XX: PrintFlagsFinal  -XX:GCTimeRatio = 19  -XX:MaxGCPauseMillis=10 -XX: UseAdaptiveSizePolicy
public class GcDemo2 {

    public static void main(String[] args) throws IOException {
        int count = 0;
        List