Skupljači smeća JVM

1. Pregled

U ovom brzom uputstvu pokazat ćemo osnove različitih Skupljanje smeća JVM (GC) implementacije. Uz to ćemo saznati kako u našim aplikacijama omogućiti određenu vrstu odvoza smeća.

2. Kratki uvod u odvoz smeća

Iz imena izgleda Kolekcija smeća bavi se pronalaženjem i brisanjem smeća iz memorije. Međutim, u stvarnosti, Kolekcija smeća prati svaki objekt dostupan u prostoru JVM hrpe i uklanja neiskorištene.

Jednostavnim riječima, GC radi u dva jednostavna koraka poznata kao Mark i Sweep:

  • Označi - tu skupljač smeća utvrđuje koji se dijelovi memorije koriste, a koji ne
  • Pomesti - ovaj korak uklanja predmete identificirane tijekom faze "označavanja"

Prednosti:

  • Nema ručnog dodjeljivanja / uklanjanja memorije, jer se neiskorištenim prostorom memorije automatski obrađuje GC
  • Nema režijskih troškova Viseći pokazivač
  • Automatski Curenje memorije upravljanje (GC samostalno ne može jamčiti potpuno dokazno rješenje za curenje memorije, međutim, on se brine za dobar dio)

Mane:

  • Od JVM mora pratiti stvaranje / brisanje referenci na objekt, ova aktivnost zahtijeva više snage procesora osim izvorne aplikacije. To može utjecati na izvedbu zahtjeva koji zahtijevaju veliku memoriju
  • Programeri nemaju kontrolu nad raspoređivanjem CPU vremena posvećenog oslobađanju objekata koji više nisu potrebni
  • Korištenje nekih implementacija GC-a može dovesti do nepredvidivog zaustavljanja programa
  • Automatizirano upravljanje memorijom neće biti tako učinkovito kao pravilno ručno dodjeljivanje / uklanjanje memorije

3. Implementacije GC-a

JVM ima četiri vrste GC implementacije:

  • Serijski sakupljač smeća
  • Paralelni sakupljač smeća
  • CMS skupljač smeća
  • G1 Sakupljač smeća

3.1. Serijski sakupljač smeća

Ovo je najjednostavnija GC implementacija, jer u osnovi radi s jednom niti. Kao rezultat, ovaj GC implementacija zamrzava sve niti aplikacije kada se izvodi. Stoga nije dobra ideja koristiti ga u višenitnim aplikacijama poput poslužiteljskog okruženja.

Međutim, izvrsno se razgovaralo Cvrkut inženjeri na QCon 2012 o performansama Serijski sakupljač smeća - što je dobar način da se ovaj kolekcionar bolje razumije.

Serijski GC odabir je sakupljača smeća za većinu aplikacija koje nemaju malo vremena za pauzom i rade na strojevima u obliku klijenta. Kako bi se omogućilo Serijski sakupljač smeća, možemo koristiti sljedeći argument:

java -XX: + UseSerialGC -jar Application.java

3.2. Paralelni sakupljač smeća

To je zadano GC od JVM a ponekad se nazivaju i kolektori protoka. Za razliku od Serijski sakupljač smeća, ovo koristi više niti za upravljanje prostorom hrpe. Ali također zamrzava druge niti aplikacije tijekom izvođenja GC.

Ako ovo upotrijebimo GC, možemo odrediti maksimalno prikupljanje smeća niti i vrijeme pauze, protok i otisak (veličina hrpe).

Brojevima niti sakupljača smeća može se upravljati pomoću opcije naredbenog retka -XX: ParallelGCThreads =.

Cilj maksimalnog vremena pauze (razmak [u milisekundama] između dva GC) naveden je s opcijom naredbenog retka -XX: MaxGCPauseMillis =.

Cilj maksimalne propusnosti (mjeren s obzirom na vrijeme provedeno u odvozu smeća u odnosu na vrijeme provedeno izvan odvoza smeća) određeno je opcijom naredbenog retka -XX: GCTimeRatio =.

Maksimalni otisak hrpe (količina memorije hrpe koju program zahtijeva tijekom izvođenja) određuje se pomoću opcije -Xmx.

Kako bi se omogućilo Paralelni sakupljač smeća, možemo koristiti sljedeći argument:

java -XX: + UseParallelGC -jar Application.java

3.3. CMS skupljač smeća

The Istodobni pregled marki (CMS) implementacija koristi više niti sakupljača smeća za sakupljanje smeća. Dizajniran je za aplikacije koje preferiraju kraće pauze prikupljanja smeća i koje si mogu priuštiti dijeljenje resursa procesora sa sakupljačem smeća dok je aplikacija pokrenuta.

Jednostavno rečeno, aplikacije koje koriste ovu vrstu GC-a u prosjeku reagiraju sporije, ali ne prestaju reagirati na obavljanje odvoza smeća.

Ovdje treba napomenuti da je od ovoga GC je istodobno, pozivanje na eksplicitno prikupljanje smeća, poput upotrebe System.gc () dok istodobni postupak radi, rezultirat će Kvar / prekid istodobnog načina rada.

Ako je više od 98% ukupnog vremena provedeno u CMS odvoz smeća i manje od 2% hrpe se oporabi, a zatim OutOfMemoryError baca CMSkolektor. Ako je potrebno, ovu značajku možete onemogućiti dodavanjem opcije -XX: -UpotrijebiGCOverheadLimit u naredbeni redak.

Ovaj kolektor također ima način rada koji je poznat kao inkrementalni način koji je zastario u Javi SE 8 i može se ukloniti u budućem glavnom izdanju.

Da biste omogućili CMS skupljač smeća, možemo koristiti sljedeću zastavicu:

java -XX: + UseParNewGC -jar Application.java

Od Jave 9, CMS sakupljač smeća zastario je. Stoga JVM ispisuje poruku upozorenja ako je pokušamo koristiti:

>> java -XX: + UseConcMarkSweepGC - verzija Java HotSpot (TM) 64-bitni poslužitelj VM upozorenje: Opcija UseConcMarkSweepGC zastarjela je u verziji 9.0 i vjerojatno će biti uklonjena u budućem izdanju. java verzija "9.0.1"

Štoviše, Java 14 potpuno je odustala od podrške za CMS:

>> java -XX: + UseConcMarkSweepGC - verzija Upozorenje 64-bitnog poslužitelja OpenJDK poslužitelja: Zanemarivanje opcije UseConcMarkSweepGC; podrška je uklonjena u 14.0 openjdk 14 2020-03-17

3.4. G1 Sakupljač smeća

G1 (Prvo smeće) Sakupljač smeća dizajniran je za programe koji rade na višeprocesorskim strojevima s velikim memorijskim prostorom. Dostupno je od JDK7 ažuriranje 4 i u kasnijim izdanjima.

G1 kolektor će zamijeniti CMS kolektor jer je učinkovitiji u izvedbi.

Za razliku od ostalih kolekcionara, G1 kolektor particionira hrpu u skup područja hrpe jednake veličine, od kojih je svaki susjedni raspon virtualne memorije. Prilikom obavljanja odvoza smeća, G1 prikazuje istodobnu globalnu fazu označavanja (tj. faza 1 poznata kao Obilježava) za određivanje živosti predmeta na čitavoj hrpi.

Nakon završetka faze ocjenjivanja, G1 zna koje su regije uglavnom prazne. Prvo se skuplja u tim područjima, što obično daje značajnu količinu slobodnog prostora (tj. Faza 2 poznata kao Brišući). Zbog toga se ovaj način sakupljanja smeća naziva Garbage-First.

Da biste omogućili G1 Sakupljač smeća, možemo koristiti sljedeći argument:

java -XX: + Koristi G1GC -jar Application.java

3.5. Izmjene Java 8

Java 8u20 je predstavio još jedan JVM parametar za smanjenje nepotrebne upotrebe memorije stvaranjem previše primjeraka iste Niz. Ovo optimizira hrpu memorije uklanjanjem duplikata Niz vrijednosti na globalni singl char [] niz.

Ovaj se parametar može omogućiti dodavanjem -XX: + UseStringDeduplication kao JVM parametar.

4. Zaključak

U ovom smo brzom vodiču pogledali različito Zbirka smeća JVM implementacije i slučajevi njihove upotrebe.

Detaljniju dokumentaciju možete pronaći ovdje.