V Javi je upravljanje pomnilnika proces dodeljevanja in odstranjevanja objektov, imenovan upravljanje pomnilnika. Java upravlja pomnilnik samodejno. Java uporablja samodejni sistem za upravljanje pomnilnika, imenovan a zbiralec smeti . Tako nam v naši aplikaciji ni treba implementirati logike upravljanja pomnilnika. Upravljanje pomnilnika Java je razdeljeno na dva glavna dela:
Struktura pomnilnika JVM
JVM ustvari različna podatkovna področja izvajalnega časa na kupu. Ta območja se uporabljajo med izvajanjem programa. Pomnilniška področja so uničena, ko JVM zapusti, medtem ko so podatkovna področja uničena, ko nit zapusti.
Območje metode
Območje metode je del pomnilnika kopice, ki si ga delijo vse niti. Ustvari se ob zagonu JVM. Uporablja se za shranjevanje strukture razreda, imena nadrazreda, imena vmesnika in konstruktorjev. JVM shranjuje naslednje vrste informacij v območju metode:
- Popolnoma kvalificirano ime vrste (npr. Niz)
- Modifikatorji vrste
- Neposredno ime nadrazreda tipa
- Strukturiran seznam popolnoma kvalificiranih imen super vmesnikov.
Območje kopice
Heap hrani dejanske predmete. Ustvari se ob zagonu JVM. Uporabnik lahko po potrebi nadzoruje kopico. Lahko je fiksne ali dinamične velikosti. Ko uporabite novo ključno besedo, JVM ustvari primerek za predmet na kupu. Medtem ko je referenca tega predmeta shranjena v skladu. Za vsak izvajajoč se proces JVM obstaja samo en kup. Ko se kup napolni, se smeti pobere. Na primer:
StringBuilder sb= new StringBuilder();
Zgornji stavek ustvari objekt razreda StringBuilder. Objekt dodeli kopici, sklic sb pa skladu. Kopica je razdeljena na naslednje dele:
- Mlada generacija
- Prostor za preživele
- Stara generacija
- Stalna generacija
- Predpomnilnik kode
Vrsta reference
Obstajajo štiri vrste referenc: Močna , Šibko , Mehko , in Fantomska referenca . Razlika med vrstami referenc je v tem, da so objekti na kupu, na katerega se nanašajo, primerni za zbiranje smeti po različnih kriterijih.
Močna referenca: Je zelo preprost, saj ga uporabljamo pri vsakodnevnem programiranju. Noben objekt, ki ima pripeto močno referenco, ni primeren za zbiranje smeti. Močno referenco lahko ustvarimo z uporabo naslednje izjave:
java primerjava
StringBuilder sb= new StringBuilder();
Šibka referenca: Po naslednjem procesu zbiranja smeti ne preživi. Če nismo prepričani, kdaj bodo podatki znova zahtevani. V tem stanju lahko ustvarimo šibko referenco nanj. V primeru, da zbiralnik smeti obdela, uniči predmet. Ko znova poskušamo pridobiti ta objekt, dobimo ničelno vrednost. Opredeljena je v java.lang.ref.WeakReference razred. Šibko referenco lahko ustvarimo z naslednjim stavkom:
WeakReference reference = new WeakReference(new StringBuilder());
Mehka referenca: Zbira se, ko aplikaciji zmanjkuje pomnilnika. Zbiralnik smeti ne zbira težko dosegljivih predmetov. Vsi mehko navedeni objekti so zbrani, preden vrže OutOfMemoryError. Mehko referenco lahko ustvarimo z naslednjim stavkom:
SoftReference reference = new SoftReference(new StringBuilder());
Fantomska referenca: Na voljo je v java.lang.ref paket. Opredeljena je v java.lang.ref.PhantomReference razred. Objekt, ki ima samo fantomsko referenco, ki kaže nanje, je mogoče zbrati, kadarkoli ga želi pobiralec smeti. Fantomsko referenco lahko ustvarimo z naslednjim stavkom:
PhantomReference reference = new PhantomReference(new StringBuilder());
Območje sklada
Območje sklada se ustvari, ko se ustvari nit. Lahko je fiksne ali dinamične velikosti. Pomnilnik sklada je dodeljen vsaki niti. Uporablja se za shranjevanje podatkov in delnih rezultatov. Vsebuje sklice na predmete kopice. Vsebuje tudi samo vrednost namesto sklica na predmet iz kopice. Spremenljivke, ki so shranjene v skladu, imajo določeno vidnost, imenovano obseg.
Okvir sklada: Okvir sklada je podatkovna struktura, ki vsebuje podatke niti. Podatki niti predstavljajo stanje niti v trenutni metodi.
- Uporablja se za shranjevanje delnih rezultatov in podatkov. Izvaja tudi dinamično povezovanje, vračanje vrednosti po metodah in pošiljanje izjem.
- Ko se metoda prikliče, se ustvari nov okvir. Ko je priklic metode končan, uniči okvir.
- Vsak okvir vsebuje lastno polje lokalnih spremenljivk (LVA), sklad operandov (OS) in podatke okvirja (FD).
- Velikosti LVA, OS in FD določene v času prevajanja.
- Samo en okvir (okvir za metodo izvajanja) je aktiven na kateri koli točki v dani niti nadzora. Ta okvir se imenuje trenutni okvir, njegova metoda pa je znana kot trenutna metoda. Razred metode se imenuje trenutni razred.
- Okvir ustavi trenutno metodo, če njena metoda prikliče drugo metodo ali če se metoda zaključi.
- Okvir, ki ga ustvari nit, je lokalen za to nit in se nanj ne more sklicevati nobena druga nit.
Native Method Stack
Znan je tudi kot C stack. Je sklad za izvorno kodo, napisano v jeziku, ki ni Java. Java Native Interface (JNI) kliče izvorni sklad. Zmogljivost izvornega sklada je odvisna od OS.
PC registri
Vsaka nit ima z njo povezan register programskega števca (PC). PC register shrani povratni naslov ali izvorni kazalec. Vsebuje tudi naslov ukazov JVM, ki se trenutno izvajajo.
Delovanje zbiralnika smeti
Pregled zbiralnika smeti
Ko se program izvaja v Javi, uporablja pomnilnik na različne načine. Kopica je del pomnilnika, kjer živijo predmeti. To je edini del pomnilnika, ki je vključen v postopek zbiranja smeti. Znan je tudi kot kup smeti. Celotno zbiranje smeti poskrbi, da ima kup čim več prostega prostora. Funkcija zbiralnika smeti je najti in izbrisati nedosegljive predmete.
Dodelitev predmeta
Ko objekt dodeli, JRockit JVM preveri velikost predmeta. Razlikuje med majhnimi in velikimi predmeti. Majhna in velika velikost sta odvisni od različice JVM, velikosti kopice, strategije zbiranja smeti in uporabljene platforme. Velikost predmeta je običajno med 2 in 128 KB.
Majhni predmeti so shranjeni v lokalnem območju niti (TLA), ki je prosti kos kopice. TLA se ne sinhronizira z drugimi nitmi. Ko je TLA poln, zahteva nov TLA.
Po drugi strani pa so veliki predmeti, ki ne sodijo v TLA, neposredno dodeljeni kopici. Če nit uporablja mladi prostor, se neposredno shrani v stari prostor. Velik objekt zahteva večjo sinhronizacijo med nitmi.
Kaj vsebuje Java Garbage Collector?
JVM nadzoruje zbiralnik smeti. JVM se odloči, kdaj bo izvedel zbiranje smeti. Od JVM lahko tudi zahtevamo, da zažene zbiralnik smeti. Vendar ni nobenega jamstva pod nobenim pogojem, da bo JVM ustrezal. JVM zažene zbiralnik smeti, če zazna, da zmanjkuje pomnilnika. Ko program Java zahteva zbiralnik smeti, JVM običajno odobri zahtevo v kratkem času. Ne zagotavlja, da so zahteve sprejete.
Bistvo, ki ga je treba razumeti, je, da kdaj objekt postane primeren za odvoz smeti? '
Vsak program Java ima več kot eno nit. Vsaka nit ima svoj izvajalni sklad. V programu Java obstaja nit, ki je metoda main(). Zdaj lahko rečemo, da je objekt primeren za zbiranje smeti, če nobena živa nit ne more dostopati do njega. Zbiralnik smeti meni, da je ta objekt primeren za izbris. Če ima program referenčno spremenljivko, ki se nanaša na objekt, ta referenčna spremenljivka je na voljo niti v živo, se ta objekt imenuje dosegljiv .
Tukaj se postavlja vprašanje, da ' Ali lahko aplikaciji Java zmanjka pomnilnika? '
Odgovor je pritrdilen. Sistem za zbiranje smeti poskuša odstraniti predmete iz pomnilnika, ko niso v uporabi. Če pa vzdržujete veliko živih predmetov, zbiranje smeti ne zagotavlja, da je na voljo dovolj pomnilnika. Učinkovito bo upravljan samo razpoložljivi pomnilnik.
Vrste zbiranja smeti
Obstaja pet vrst zbiranja smeti, in sicer:
Algoritem za označevanje in brisanje
JRockit JVM uporablja algoritem mark in sweep za izvajanje zbiranja smeti. Vsebuje dve fazi, fazo označevanja in fazo pometanja.
Označi fazo: Objekti, ki so dostopni iz niti, izvornih ročajev in drugih korenskih virov GC, so označeni kot aktivni. Vsako drevo objektov ima več kot en korenski objekt. Koren GC je vedno dosegljiv. Torej kateri koli objekt, ki ima koren zbiranja smeti v svojem korenu. Identificira in označi vse predmete, ki so v uporabi, preostale pa lahko štejemo za smeti.
Faza pometanja: V tej fazi se kup prečka, da se najde vrzel med živimi predmeti. Te vrzeli so zabeležene na brezplačnem seznamu in so na voljo za novo dodelitev objektov.
Obstajata dve izboljšani različici mark in sweep:
Sočasno označevanje in pometanje
Omogoča nadaljevanje izvajanja niti med velikim delom zbiranja smeti. Obstajajo naslednje vrste označevanja:
Vzporedno označevanje in pometanje
Uporablja ves razpoložljiv CPU v sistemu za čim hitrejše izvajanje zbiranja smeti. Imenuje se tudi vzporedni zbiralnik smeti. Niti se ne izvajajo, ko se izvaja vzporedno zbiranje smeti.
Prednosti Mark in Sweep
- Gre za ponavljajoč se proces.
- To je neskončna zanka.
- Med izvajanjem algoritma niso dovoljeni dodatni režijski stroški.
Slabosti Mark in Sweep
- Ustavi običajno izvajanje programa, medtem ko teče algoritem za zbiranje smeti.
- Večkrat se zažene v programu.