V Jave je správa pamäte proces prideľovania a oddeľovania objektov, nazývaný správa pamäte. Java robí správu pamäte automaticky. Java používa automatický systém správy pamäte nazývaný a smetiar . Preto nie sme povinní implementovať logiku správy pamäte v našej aplikácii. Správa pamäte Java sa delí na dve hlavné časti:
Štruktúra pamäte JVM
JVM vytvára rôzne oblasti údajov o čase spustenia v halde. Tieto oblasti sa používajú počas vykonávania programu. Pamäťové oblasti sú zničené pri ukončení JVM, zatiaľ čo dátové oblasti sú zničené pri ukončení vlákna.
Oblasť metódy
Oblasť metód je časť pamäte haldy, ktorá je zdieľaná medzi všetkými vláknami. Vytvára sa pri spustení JVM. Používa sa na uloženie štruktúry triedy, názvu nadtriedy, názvu rozhrania a konštruktorov. JVM ukladá do oblasti metódy nasledujúce druhy informácií:
a b c čísla
- Plne kvalifikovaný názov typu (napr.: String)
- Modifikátory typu
- Priamy názov nadtriedy typu
- Štruktúrovaný zoznam plne kvalifikovaných názvov super rozhraní.
Oblasť haldy
Halda ukladá skutočné objekty. Vytvára sa pri spustení JVM. Používateľ môže v prípade potreby haldu ovládať. Môže mať pevnú alebo dynamickú veľkosť. Keď použijete nové kľúčové slovo, JVM vytvorí inštanciu pre objekt v halde. Zatiaľ čo odkaz na tento objekt sa ukladá do zásobníka. Pre každý spustený proces JVM existuje iba jedna halda. Keď sa halda zaplní, odpad sa pozbiera. Napríklad:
StringBuilder sb= new StringBuilder();
Vyššie uvedený príkaz vytvára objekt triedy StringBuilder. Objekt sa alokuje do haldy a referenčný sb sa alokuje do zásobníka. Hromada je rozdelená na tieto časti:
- Mladá generácia
- Priestor prežitia
- Stará generácia
- Stála generácia
- Vyrovnávacia pamäť kódu
Typ referencie
Existujú štyri typy referencií: Silný , slabý , Mäkký , a Fantómová referencia . Rozdiel medzi typmi odkazov je v tom, že objekty na halde, na ktoré odkazujú, sú vhodné na zbieranie odpadu podľa rôznych kritérií.
Silná referencia: Je to veľmi jednoduché, keďže ho používame pri každodennom programovaní. Akýkoľvek objekt, ku ktorému je pripojený Silný odkaz, nie je vhodný na zber odpadu. Silnú referenciu môžeme vytvoriť pomocou nasledujúceho vyhlásenia:
StringBuilder sb= new StringBuilder();
Slabá referencia: Po ďalšom procese zberu odpadu neprežije. Ak si nie sme istí, kedy budú údaje znova vyžiadané. V tomto stave naň môžeme vytvoriť slabý odkaz. V prípade, že zberač odpadu spracuje, zničí objekt. Keď sa znova pokúsime získať tento objekt, dostaneme hodnotu null. Je definovaný v java.lang.ref.WeakReference trieda. Slabú referenciu môžeme vytvoriť pomocou nasledujúceho príkazu:
WeakReference reference = new WeakReference(new StringBuilder());
Mäkká referencia: Zhromažďuje sa, keď má aplikácia nedostatok pamäte. Zberač odpadu nezbiera predmety, ktoré sú na dosah ruky. Všetky objekty, na ktoré sa odkazuje, sa zhromažďujú predtým, ako sa zobrazí chyba OutOfMemoryError. Mäkký odkaz môžeme vytvoriť pomocou nasledujúceho príkazu:
SoftReference reference = new SoftReference(new StringBuilder());
Fantómová referencia: Je dostupný v java.lang.ref balík. Je definovaný v java.lang.ref.PhantomReference trieda. Objekt, ktorý má iba fantómovú referenciu, ktorá naň ukazuje, je možné zbierať kedykoľvek chce zberač odpadu zbierať. Fantómovú referenciu môžeme vytvoriť pomocou nasledujúceho príkazu:
PhantomReference reference = new PhantomReference(new StringBuilder());
Oblasť zásobníka
Oblasť zásobníka sa generuje pri vytváraní vlákna. Môže mať pevnú alebo dynamickú veľkosť. Pamäť zásobníka je pridelená na vlákno. Slúži na ukladanie údajov a čiastkových výsledkov. Obsahuje odkazy na haldové objekty. Obsahuje tiež samotnú hodnotu, nie odkaz na objekt z haldy. Premenné, ktoré sú uložené v zásobníku, majú určitú viditeľnosť, nazývanú rozsah.
Hromadný rám: Zásobník je dátová štruktúra, ktorá obsahuje dáta vlákna. Údaje vlákna predstavujú stav vlákna v aktuálnej metóde.
- Slúži na ukladanie čiastkových výsledkov a údajov. Vykonáva tiež dynamické prepojenie, hodnoty vracajú metódami a odosiela výnimky.
- Keď sa metóda vyvolá, vytvorí sa nový rámec. Po dokončení vyvolania metódy zničí rámec.
- Každý rámec obsahuje vlastné pole miestnych premenných (LVA), zásobník operandov (OS) a údaje rámca (FD).
- Veľkosti LVA, OS a FD určené v čase kompilácie.
- Iba jeden rámec (rámec pre vykonanie metódy) je aktívny v akomkoľvek bode daného vlákna riadenia. Tento rámec sa nazýva aktuálny rámec a jeho metóda je známa ako aktuálna metóda. Trieda metódy sa nazýva aktuálna trieda.
- Rám zastaví aktuálnu metódu, ak jej metóda vyvolá inú metódu alebo ak sa metóda dokončí.
- Rám vytvorený vláknom je lokálny pre toto vlákno a nemôže naň odkazovať žiadne iné vlákno.
Zásobník natívnych metód
Je tiež známy ako zásobník C. Je to zásobník pre natívny kód napísaný v inom jazyku ako Java. Java Native Interface (JNI) volá natívny zásobník. Výkon natívneho zásobníka závisí od operačného systému.
np.sum
PC registre
Každé vlákno má priradený register počítadla programov (PC). PC register ukladá návratovú adresu alebo natívny ukazovateľ. Obsahuje tiež adresu inštrukcií JVM, ktoré sa práve vykonávajú.
Práca zberača odpadu
Prehľad zberača odpadu
Keď sa program vykonáva v jazyku Java, používa pamäť rôznymi spôsobmi. Halda je súčasťou pamäte, kde žijú predmety. Je to jediná časť pamäte, ktorá sa podieľa na procese zberu odpadu. Je tiež známy ako zberateľská halda odpadu. Všetok zber odpadu zabezpečuje, že halda má čo najviac voľného miesta. Funkciou zberača odpadu je nájsť a odstrániť objekty, ktoré nie sú dostupné.
Pridelenie objektu
Keď sa objekt pridelí, JRockit JVM skontroluje veľkosť objektu. Rozlišuje malé a veľké predmety. Malá a veľká veľkosť závisí od verzie JVM, veľkosti haldy, stratégie zberu odpadu a použitej platformy. Veľkosť objektu je zvyčajne medzi 2 až 128 kB.
Malé objekty sú uložené v Thread Local Area (TLA), čo je voľná časť haldy. TLA sa nesynchronizuje s inými vláknami. Keď sa TLA naplní, požiada o novú TLA.
Na druhej strane veľké objekty, ktoré sa nezmestia do TLA, priamo prideľujú do haldy. Ak vlákno používa mladý priestor, uloží sa priamo do starého priestoru. Veľký objekt vyžaduje väčšiu synchronizáciu medzi vláknami.
Čo znamená Java Garbage Collector?
JVM riadi zberač odpadu. JVM rozhodne, kedy vykonať zber odpadu. Môžeme tiež požiadať JVM o spustenie zberača odpadu. Neexistuje však žiadna záruka za žiadnych podmienok, že JVM splní. JVM spustí zberač odpadu, ak zistí, že dochádza k nedostatku pamäte. Keď program Java požiada o zberač odpadu, JVM zvyčajne vyhovie žiadosti v krátkom čase. Nezabezpečuje, aby boli žiadosti akceptované.
Dôležité je pochopiť, že ' keď sa objekt stane spôsobilým na zber odpadu? '
Každý program Java má viac ako jedno vlákno. Každé vlákno má svoj zásobník vykonávania. V programe Java sa má spustiť vlákno, ktoré je metódou main(). Teraz môžeme povedať, že objekt je vhodný na zber odpadu, keď k nemu nemá prístup žiadne živé vlákno. Zberač odpadu považuje tento objekt za vhodný na vymazanie. Ak má program referenčnú premennú, ktorá odkazuje na objekt, túto referenčnú premennú dostupnú pre živé vlákno, volá sa tento objekt dosiahnuteľný .
Tu vyvstáva otázka, že ' Môže mať Java aplikácia nedostatok pamäte? '
Odpoveď je áno. Systém zberu odpadu sa pokúša získať objekty z pamäte, keď sa nepoužívajú. Ak však udržiavate veľa živých objektov, zber odpadu nezaručuje dostatok pamäte. Účinne bude spravovaná iba dostupná pamäť.
Druhy zberu odpadu
Existuje päť typov zberu odpadu:
koľko váži kat timpf
Algoritmus Mark and Sweep
JRockit JVM používa algoritmus mark a sweep na vykonávanie zberu odpadu. Obsahuje dve fázy, fázu označovania a fázu zametania.
Označiť fázu: Objekty, ktoré sú prístupné z vlákien, natívnych ovládačov a iných koreňových zdrojov GC, sú označené ako živé. Každý strom objektov má viac ako jeden koreňový objekt. Koreň GC je vždy dosiahnuteľný. Čiže akýkoľvek objekt, ktorý má vo svojom koreni koreň na zber odpadu. Identifikuje a označí všetky predmety, ktoré sa používajú, a ostatné možno považovať za odpad.
Fáza zametania: V tejto fáze sa hromada prechádza, aby sa našla medzera medzi živými objektmi. Tieto medzery sú zaznamenané vo voľnom zozname a sú k dispozícii na pridelenie nového objektu.
Existujú dve vylepšené verzie mark and sweep:
Súbežné označenie a zametanie
Umožňuje vláknam pokračovať v chode počas veľkej časti zberu odpadu. Existujú nasledujúce typy označenia:
Paralelný Mark a Sweep
Využíva všetky dostupné CPU v systéme na vykonanie zberu odpadu čo najrýchlejšie. Nazýva sa aj paralelný zberač odpadu. Vlákna sa nevykonajú, keď sa vykoná paralelný zber odpadu.
Plusy Marka a Sweepa
- Je to opakujúci sa proces.
- Je to nekonečná slučka.
- Počas vykonávania algoritmu nie sú povolené žiadne ďalšie režijné náklady.
Nevýhody Mark a Sweep
- Zastaví bežné vykonávanie programu, kým je spustený algoritmus garbage collection.
- Beží viackrát na programe.