Garbage Collectors algoritmit
Garbage Collectorilla on tyypillisesti seuraavat tavoitteet (helpommin sanottu kuin tehty)
- Erittäin lyhyet ”pysäytä maailma tauoilla”, joiden tavoite on muutama millisekunti
- Taukojen kestoajat eivät lisäänny kasan kasaantuessa, livenä, tai root-setin kokoa
- Käsittelee kasan kokoja muutamasta MB:stä useisiin TB:iin
- Suuri samanaikaisuus – Kaikki raskas työ tehdään samalla kun Java-säikeet jatkavat suoritusta
- Suuri läpimeno
- Helppo virittää
Jätteenkerääjät
Tieto kasassa partitioidaan useisiin allokaatioalueisiin (tai sukupolviin), jotka pidetään erillään objektin iän perusteella (esim.eli selviytyneiden GC-iteraatioiden lukumäärän mukaan). Jotkut keräilijät ovat yksisukupolvisia, kun taas toiset käyttävät kahta sukupolvea: (1) Nuori sukupolvi (jaettuna edelleen Edeniin ja kahteen Survivor-alueeseen) ja (2) Vanha (tai Tenured) sukupolvi.
Lähde: Blogi: Ionut Balosin
Kahden sukupolven keräilijät:
Serial GC – Algoritmi käyttää yhtä säiettä suorittamaan kaiken roskienkeruutyön, mikä tekee siitä suhteellisen tehokkaan, koska säikeiden välillä ei ole kommunikointikustannuksia. Se soveltuu parhaiten yhden prosessorin koneisiin, koska se ei pysty hyödyntämään moniprosessorilaitteistoa.
Rinnakkainen (rinnakkainen) GC – Tämä algoritmi käyttää nuoressa sukupolvessa mark-copy-menetelmää ja vanhassa sukupolvessa mark-sweep-compact-menetelmää. Sekä Young- että Old-keräys laukaisevat stop-the-world-tapahtumat, jotka pysäyttävät kaikki sovellussäikeet roskienkeräyksen suorittamista varten. Molemmat keräilijät suorittavat merkintä- ja kopiointi-/kompaktifiointivaiheet käyttämällä useita säikeitä, mistä nimi ”Rinnakkainen”.
Rinnakkainen roskienkeräilijä soveltuu moniytimisille koneille tapauksissa, joissa ensisijaisena tavoitteena on lisätä läpimenoa. Suurempi läpimeno saavutetaan järjestelmän resurssien tehokkaamman käytön ansiosta:
- keräyksen aikana kaikki ytimet puhdistavat roskat rinnakkain, mikä johtaa lyhyempiin taukoihin
- roskienkeräysjaksojen välissä kumpikaan keräilijä ei kuluta resursseja
Garbage First (G1) GC – Tämä keräilijä on palvelintyylinen roskienkeräilijä, ja se on suunnattu moniydinkoneille, joissa on suuret muistit. Se täyttää roskienkeräyksen (GC) taukoaikatavoitteet suurella todennäköisyydellä ja saavuttaa samalla korkean läpimenotehon.
- G1-kerääjä käyttää erilaista lähestymistapaa kasan muistimallin suhteen. Kasa on jaettu joukkoon samankokoisia kasa-alueita, joista kukin on yhtenäinen alue virtuaalimuistia.
- Tietyille aluejoukoille annetaan samat roolit (eden, survivor, old) kuin vanhemmissa keräilijöissä, mutta niille ei ole kiinteää kokoa.
- Aluekoko valitaan JVM:ssä käynnistyksen yhteydessä. JVM valitsee yleensä noin 2000 aluetta, joiden koko vaihtelee 1 ja 32 Mt välillä. G1-kerääjä käyttää erilaista lähestymistapaa
Lisätietoja on kohdassa Getting Started with the G1 GC
Uni sukupolvikerääjät:
Shenandoah GC – Shenandoah on low pause time garbage collector, joka lyhentää GC:n taukoaikoja suorittamalla enemmän roskienkeruutyötä samanaikaisesti käynnissä olevan Java-ohjelman kanssa. Shenandoah tekee suurimman osan GC-työstä samanaikaisesti, mukaan lukien samanaikainen tiivistäminen, mikä tarkoittaa, että sen taukoajat eivät ole enää suoraan verrannollisia kasan kokoon. Roskien keräyksellä 200 Gt:n kasaan tai 2 Gt:n kasaan pitäisi olla samankaltainen alhainen taukokäyttäytyminen.
Lisätietoa löytyy Wikissä olevasta Implementoinnin yksityiskohdista
Z GC – ZGC on rinnakkainen, yhden sukupolven, aluepohjainen, NUMA:n huomioiva, tiivistävä kerääjä. Stop-the-world-vaiheet on rajoitettu root-skannaukseen, joten GC:n taukoajat eivät kasva kasan tai live-joukon koon kasvaessa.
Lisätietoa löytyy Per Lidenin ZGC:tä käsittelevästä istunnosta YouTubessa
Loppujen lopuksi,
Epsilon GC (kokeellinen)- GC, joka käsittelee muistin allokointia, mutta ei toteuta varsinaista muistinpalautusjärjestelmää. Kun käytettävissä oleva Java heap on käytetty loppuun, JVM sammuu. Suunniteltu JDK:n sisäistä testausta varten, mutta voi mahdollisesti olla hyödyllinen kahdessa tilanteessa
- Erittäin lyhytikäiset ohjelmat
- Ohjelmat on kirjoitettu huolellisesti siten, että muistia käytetään uudelleen eikä uusia allokaatioita tehdä koskaan
.