Zberatelia odpadu JVM

1. Prehľad

V tomto rýchlom návode si ukážeme základy rôznych JVM Garbage Collection (GC) implementácie. Ďalej zistíme, ako povoliť konkrétny typ Garbage Collection v našich aplikáciách.

2. Stručný úvod do zberu odpadu

Podľa názvu to vyzerá Zber odpadu sa zaoberá hľadaním a vymazaním smetí z pamäte. V skutočnosti však Zber odpadu sleduje všetky dostupné objekty v halde priestoru JVM a odstraňuje nepoužívané.

Jednoduchými slovami GC funguje v dvoch jednoduchých krokoch známych ako Mark and Sweep:

  • Mark - je to miesto, kde garbage collector identifikuje, ktoré časti pamäte sa používajú a ktoré nie
  • Zametať - tento krok odstráni objekty identifikované počas fázy „označenia“

Výhody:

  • Žiadna manuálna manipulácia s prideľovaním / prideľovaním pamäte, pretože nevyužitý pamäťový priestor je automaticky spracovávaný používateľom GC
  • Žiadna réžia manipulácie Visiaci ukazovateľ
  • Automaticky Únik pamäte zvládanie (GC sám o sebe nemôže zaručiť úplné riešenie úniku pamäte, o veľkú časť sa však postará)

Nevýhody:

  • Odkedy JVM musí sledovať vytváranie / mazanie referencií na objekty, táto činnosť vyžaduje okrem pôvodnej aplikácie aj viac výkonu procesora. Môže to ovplyvniť výkon požiadaviek, ktoré si vyžadovali veľkú pamäť
  • Programátori nemajú žiadnu kontrolu nad plánovaním času CPU určeného na uvoľnenie objektov, ktoré už nie sú potrebné
  • Používanie niektorých implementácií GC môže mať za následok nepredvídateľné zastavenie aplikácie
  • Automatizovaná správa pamäte nebude taká efektívna ako správne ručné pridelenie / pridelenie pamäte

3. Implementácie GC

JVM má štyri typy GC implementácie:

  • Sériový zberač odpadu
  • Paralelný zberač odpadu
  • CMS Garbage Collector
  • Zberač odpadu G1

3.1. Sériový zberač odpadu

Toto je najjednoduchšia implementácia GC, pretože v zásade funguje s jedným vláknom. Ako výsledok, toto GC implementácia zastaví všetky vlákna aplikácie, keď je spustená. Preto nie je dobrý nápad používať ho vo viacvláknových aplikáciách, ako sú serverové prostredia.

Avšak, bol tam vynikajúci rozhovor Twitter inžinierov na QCone 2012 o výkone Sériový zberač odpadu - čo je dobrý spôsob, ako lepšie porozumieť tomuto zberateľovi.

Serial GC je zberač odpadkov podľa výberu pre väčšinu aplikácií, ktoré nemajú malé požiadavky na čas pauzy a pracujú na strojoch v klientskom štýle. Umožniť Sériový zberač odpadu, môžeme použiť nasledujúci argument:

java -XX: + UseSerialGC -jar Application.java

3.2. Paralelný zberač odpadu

Je to predvolené GC z JVM a niekedy sa nazývajú priechodné kolektory. Na rozdiel od Sériový zberač odpadu, toto používa viac vlákien na správu haldy priestoru. Počas výkonu ale zmrazí aj ďalšie vlákna aplikácií GC.

Ak použijeme toto GC, môžeme určiť maximálny zber odpadu vlákna a pozastaviť čas, priepustnosť a stopu (veľkosť haldy).

Počet vlákien zberača odpadu je možné ovládať pomocou voľby príkazového riadku -XX: ParallelGCThreads =.

Cieľ maximálnej časovej prestávky (medzera [v milisekundách] medzi dvoma GC) je určený voľbou príkazového riadku -XX: MaxGCPauseMillis =.

Cieľ maximálnej priepustnosti (meraný vzhľadom na čas strávený zberom odpadu a časom stráveným mimo zberu odpadu) je určený voľbou príkazového riadku -XX: GCTimeRatio =.

Maximálna stopa haldy (množstvo haldy pamäte, ktoré program vyžaduje počas behu) sa zadáva pomocou možnosti -Xmx.

Umožniť Paralelný zberač odpadu, môžeme použiť nasledujúci argument:

java -XX: + UseParallelGC -jar Application.java

3.3. CMS Garbage Collector

The Súbežný postup značkovania (CMS) implementácia používa na zber odpadu viac vlákien zberača odpadu. Je určený pre aplikácie, ktoré uprednostňujú kratšie pauzy odvozu odpadu a ktoré si môžu dovoliť zdieľať prostriedky procesora so zberačom odpadu, keď je aplikácia spustená.

Jednoducho povedané, aplikácie využívajúce tento typ GC reagujú v priemere pomalšie, ale neprestávajú reagovať na vykonanie odvozu odpadu.

Tu si treba rýchlo uvedomiť, že od tohto okamihu GC je súbežné vyvolanie explicitného zberu odpadu, napríklad použitie System.gc () zatiaľ čo súčasný proces funguje, bude mať za následok Porucha / prerušenie súbežného režimu.

Ak je v roku strávených viac ako 98% z celkového času CMS zber odpadu a zhodnocujú sa menej ako 2% haldy, potom OutOfMemoryError je vyhodený CMSzberateľ. V prípade potreby je možné túto funkciu deaktivovať pridaním možnosti -XX: -UseGCOverheadLimit do príkazového riadku.

Tento kolektor má tiež režim známy ako prírastkový režim, ktorý je v prostredí Java SE 8 zastaraný a v budúcom významnom vydaní môže byť odstránený.

Ak chcete povoliť CMS Garbage Collector, môžeme použiť nasledujúci príznak:

java -XX: + UseParNewGC -jar Application.java

Od verzie Java 9 je podpora zberača odpadu v systéme CMS zastaraná. Preto JVM vytlačí varovnú správu, ak sa ju pokúsime použiť:

>> java -XX: + UseConcMarkSweepGC --version Varovanie 64-bitového servera Java HotSpot (TM) na serveri VM: Možnosť UseConcMarkSweepGC bola vo verzii 9.0 zastaraná a bude pravdepodobne v budúcom vydaní odstránená. java verzia "9.0.1"

Okrem toho Java 14 úplne zrušila podporu CMS:

>> java -XX: + UseConcMarkSweepGC --version Varovanie OpenJDK 64-bitového servera VM: Ignorovanie možnosti UseConcMarkSweepGC; podpora bola odstránená v 14.0 openjdk 14 2020-03-17

3.4. Zberač odpadu G1

Zberač odpadu G1 (najskôr Garbage) je určený pre aplikácie bežiace na viacprocesorových strojoch s veľkým pamäťovým priestorom. Je k dispozícii od Aktualizácia JDK7 4 a v neskorších vydaniach.

G1 kolektor nahradí CMS kolektor, pretože je výkonovo efektívnejší.

Na rozdiel od iných zberateľov G1 kolektor rozdelí haldu na množinu rovnako veľkých oblastí haldy, z ktorých každá má súvislý rozsah virtuálnej pamäte. Pri vykonávaní zbierania odpadu G1 ukazuje súbežnú fázu globálneho značenia (t.j. fáza 1 známa ako Značenie) na určenie živosti predmetov v celej kope.

Po dokončení fázy označovania G1 vie, ktoré regióny sú väčšinou prázdne. Zhromažďuje sa najskôr v týchto oblastiach, čo zvyčajne poskytuje značné množstvo voľného priestoru (t. J. Fáza 2 známa ako Zametanie). Preto sa tento spôsob zberu odpadu nazýva Garbage-First.

Ak chcete povoliť Zberač odpadu G1, môžeme použiť nasledujúci argument:

java -XX: + UseG1GC -jar Application.java

3.5. Zmeny v Java 8

Java 8u20 zaviedla ešte jednu JVM parameter na zníženie zbytočného využitia pamäte vytvorením príliš veľa inštancií toho istého String. Toto optimalizuje haldu pamäte odstránením duplikátov String hodnoty na globálny singel char [] pole.

Tento parameter je možné povoliť pridaním -XX: + UseStringDeduplication ako JVM parameter.

4. Záver

V tomto rýchlom návode sme sa pozreli na rôzne možnosti Zber odpadu JVM implementácie a ich prípady použitia.

Podrobnejšiu dokumentáciu nájdete tu.


$config[zx-auto] not found$config[zx-overlay] not found