Teknologian jakaminen

[GC-jätteenkeräysalgoritmi ja keräilijä]

2024-07-11

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

Kirjailija: ofLJli
Linkki: https://juejin.cn/post/7003213289425633287?searchId=20240709085629749958B21D886D4E67D4
Lähde: Rare Earth Nuggets
Tekijänoikeus kuuluu tekijälle. Jos kyseessä on kaupallinen uusintapaino, ota yhteyttä tekijään luvan saamiseksi.


Yleiskatsaus

JVM:n päärakenteet ovat: virtuaalikoneen pino, pino ja metodialue. Virtuaalikonepinon pinokehyksen koon on määrittänyt kääntäjä Metodin tai säietekniikan päättyessä myös virtuaalikoneen pinon muisti kierrätetään. Java-keko- ja menetelmä-alueella on merkittäviä epävarmuustekijöitä. Tämän muistin osan jakaminen ja kierrätys ovat dynaamisia.

Tämä artikkeli keskittyy seuraaviin kolmeen asiaan, jotka GC:n on suoritettava:

  • Milloin kierrättää? (GC:n käynnistävät olosuhteet)
  • Roskien keräysalgoritmi
  • Roskankerääjä

Milloin kierrättää

Kahden sukupolven hypoteesin mukaan:绝大多数的对象都是朝生夕死熬过越多次的GC回收的对象就越难回收 . Kasa on jaettu sukupolviin: uusi sukupolvi (Eden, From, To), vanha sukupolvi ja sukupolvien kierrätystä tehdään myös GC:n aikana.

image.png

Pieni GC : Kierrätä uuden sukupolven käyttämättömät esineet Useimmille uuden sukupolven esineille on ominaista, että ne elävät ja kuolevat yhdessä yössä. Käynnistysajat ovat:

  • Riittämätön tila Eden-alueella laukaisee Minor GC:n Koska Eden-tilan koko on rajoitettu, Minor GC laukeaa useammin. Tämä vaatii nopean ja tehokkaan keräilyalgoritmin, jota käytetään yleensä.标记-复制算法Kierrätä tämä alue (käsitellään myöhemmin).

Majuri GC : Kierrätä vanhan sukupolven käyttämättömät esineet.yleinen käyttö标记-清除算法tai标记-整理算法Kierrättää.

Täysi GC : Kierrätä käyttämättömät kohteet kasa- ja menetelmäalueella. Full GC -kierrätysalue on suhteellisen suuri ja pitkä suoritusaika saattaa aiheuttaa viiveitä, joten Full GC:n määrää tulee vähentää mahdollisimman paljon. Laukaisuajat ovat suunnilleen seuraavat:

  • Vanhan sukupolven tilan riittämättömyys johtuu uuden sukupolven esineistä, jotka tulevat vanhaan sukupolveen, suuret esineet suoraan vanhaan sukupolveen jne. Jos näitä esineitä ei voida säilyttää vanhan sukupolven jatkuvassa enimmäistilassa, suoritetaan täysi GC-kierrätys. .

  • Menetelmäalueella ei ole tarpeeksi tilaa. Menetelmäalue tallentaa pääosin tyyppitietoa ja jatkuvia pooleja. On myös olemassa vaara, että tila ei riitä, ja suoritetaan täysi GC-kierrätys.

  • System.gc() on nimenomaisesti kutsuttu ja Full GC kierrättää sen.

Kolme jätteenkeräysalgoritmia:

1. Merkitse ja pyyhkäise -algoritmi

Periaate: käyttö可达性分析算法Tee käyttämättömistä objekteistamerkkija suorita sittenAsia selvä . Haitat: Merkintätehokkuus on alhainen, kun kohteita on paljon. Objektin tyhjentämisen jälkeen tapahtuu muistin pirstoutumista ja muisti on epäjatkuva. Tarkoitus: Jotkut keräilijät käyttävät tätä algoritmia vanhan sukupolven kokoelmassa

2. Merkintä-kopio-algoritmi

Periaate: Jaa muistitila kahteen osaan, puolet käytetään objektien tallentamiseen ja toinen puoli on vapaata.Jos esineiden säilytysalue on täynnä, käytä可达性分析算法Siirrä eläviä esineitämerkkitule ulos ja sittenkopio Siirry toiselle tyhjälle alueelle ja tyhjennä kaikki edelliset alueet tyhjiksi jatkuviin tiloihin. Haitta: Jos säilyneitä esineitä on paljon, tarvitaan paljon muistin kopiointia ja kehitystä. Muistitila voi käyttää vain puolet eduista ja tuhlata resursseja. Toiminto: Tätä kierrätysalgoritmia käytetään yleensä kohteissa, jotka elävät ja kuolevat uuden sukupolven aikana. Replikointialgoritmi on kuitenkin optimoitu uudessa sukupolvessa, mutta tämä algoritmi lisää allokointitakuumekanismin estämään liian monen eloonjääneen objektin allokoinnin. Appel-tyylistä kierrätysalgoritmia käytetään:

image.png

3. Merkintä-lajittelualgoritmi

Periaate: Merkintäprosessi on seuraava标记-清除算法Sama sitten整理存Elävät objektit siirtyvät toiseen päähän ja sitten kaikki elävän rajan ulkopuolella olevat objektit清除 . Haitat: Esineiden siirtäminen sisältää jonkin verran riskiä. Liian monet esineet ovat tehottomia.

image.png

Roskankerääjä

GC:n käyttämää roskakerääjää käytetään kierrätykseen. kokoelma.

Yksisäikeinen keräilijä

Yksisäikeisten keräilijöiden yhdistelmät ovat: Serial/Serial Vanha keräilijä. He eivät ainoastaan ​​käytä kokoelmasäiettä kokoelmatoiminnon suorittamiseen, vaan kokoelmasäikeen toimiessa käyttäjäsäikeen on lakattava odottamasta, kunnes kokoelma on valmis. Kuvassa on Serial/Serial Old -keräimen kaavio:

image.png Jos asiakkaan muistiresurssit ovat rajalliset, prosessoriytimien määrä on pieni tai kyseessä on yksiytiminen prosessori, sen yksinkertaisuus ja tehokkuus voivat saada keräilijän suorittamaan työnsä mahdollisimman nopeasti.

Monikierteinen rinnakkaiskeräin

Monisäikeisiä keräilijöitä ovat: ParNew, Parallel Scavenge ja Parallel Old, joista Parallel Scavenge/Parallel Old on yhdistetty keräilijä. Nämä monisäikeiset keräilijät lisäävät vain jätteenkeräyssäikeitä, ja käyttäjäsäikeet lakkaavat edelleen odottamasta roskien keräämistä.

image.png

parNew kerääjä: Se on itse asiassa monisäikeinen versio Serialista. Se voi tällä hetkellä toimia yhteistyössä Serial-keräilijän ja CMS-keräilijän kanssa.

Parallel Scavenge -keräin: Käytetään yleensä yhdessä Parallel Old -keräimen kanssa.Verrattuna parNew keräilijään, se kiinnittää enemmän huomiota吞吐量ohjaus, läpijuoksu onKäyttäjäsäikeen suoritusaika vastaa suorittimen kokonaiskäyttöaikaa, läpimeno on tietysti mitä suurempi, sitä parempi.

Multi-threading käyttää yleensä palvelinta, koska monisäikeen suorittamiseen liittyy aikaviipaleen kiertokulun aika. Jos kyseessä on yksi prosessori, käsittelyteho on epäilemättä hitaampi. Mutta se on erittäin hyvä resursseille, ja analyysilaskelmien palvelinpuoli, jonka ei tarvitse olla vuorovaikutuksessa käyttäjän kanssa, voi lisätä suoritustehokkuutta.

samanaikainen keräilijä

Samanaikaisia ​​kerääjiä ovat: CMS-keräilijä, joka pyrkii pitämään järjestelmän taukoajan mahdollisimman lyhyenä ja tarjoamaan paremman käyttökokemuksen. Sen kokoelmasäie voidaan suorittaa samanaikaisesti käyttäjäsäikeen kanssa. CMS:ssä on kolme标记(alkuarvosana, rinnakkaisarvosana, huomautus) ja kerran清理(Samanaikainen puhdistus), kaksi kolmesta merkinnöistä edellyttää lyhyemmän käyttäjäsäikeen pysähtymistä, yhden pidemmän merkinnän, joka on samanaikainen käyttäjäsäikeen kanssa, ja tyhjennyksen, joka on samanaikainen käyttäjäsäikeen kanssa.

image.png

alkumerkki: Merkitse ensimmäinen GC Rootsiin liittyvä objekti, aika on hyvin lyhyt samanaikainen merkintä: Suorita GC Rootsin viiteketju (saatettavuusanalyysialgoritmi) samanaikaisesti käyttäjäsäikeen kanssa, mikä kestää kauan merkitä uudelleen : Hae uudelleen samanaikaisen merkintävaiheen aikana käyttäjäketjun luomaa uutta viiteketjua. Hieman pidempi kuin alkuperäinen merkki.Samanaikainen selkeä:käyttää标记-清除算法Puhdista hyödyttömät esineet.

Kolme suurta haittaa: 1: Suorittimen herkkyys, samanaikaisuus voi vaikuttaa käyttäjän säikeiden toimintaan prosessoreissa, joissa on pieni määrä ytimiä. 2: Kelluva roska: Samanaikaisen puhdistusvaiheen aikana syntyneet roskat voivat vain odottaa seuraavaa GC-keräystä. Kolme: Muistin pirstoutuminen, merkintä-puhdistus Puja-tuotteissa on paljon epäjatkuvaa muistitilaa.

yhteenveto

Tämä artikkeli alkaa那些内存需要回收什么时候回收如何回收Toteutuksena kirjoitetaan kaksi objektin selviytymisarviointialgoritmia, luokka-alueen kierrätyksen ehdot, kierrätyksen sukupolvimekanismi ja keräysajoitus, kolme keräilyalgoritmia ja yleisesti käytetyt roskakeräimet.