Java programoje atminties valdymas yra objektų paskirstymo ir paskirstymo panaikinimo procesas, vadinamas atminties valdymu. Java automatiškai valdo atmintį. Java naudoja automatinę atminties valdymo sistemą, vadinamą a šiukšlių surinkėjas . Taigi, mes neprivalome įdiegti atminties valdymo logikos savo programoje. „Java“ atminties valdymas yra padalintas į dvi pagrindines dalis:
JVM atminties struktūra
JVM sukuria įvairias vykdymo laiko duomenų sritis krūvoje. Šios sritys naudojamos programos vykdymo metu. Atminties sritys sunaikinamos, kai JVM išeina, o duomenų sritys sunaikinamos, kai išeina gija.
Metodo sritis
Metodo sritis yra krūvos atminties dalis, kuri yra bendrinama tarp visų gijų. Jis sukuriamas paleidus JVM. Jis naudojamas saugoti klasės struktūrą, superklasės pavadinimą, sąsajos pavadinimą ir konstruktorius. JVM metodo srityje saugo šių tipų informaciją:
10 iš 50.00
- Visiškai apibrėžtas tipo pavadinimas (pvz., eilutė)
- Tipo modifikatoriai
- Tipo tiesioginis superklasės pavadinimas
- Struktūrizuotas visiškai apibrėžtų super sąsajų pavadinimų sąrašas.
Krūvos sritis
„Heap“ saugo tikruosius objektus. Jis sukuriamas paleidus JVM. Jei reikia, vartotojas gali valdyti krūvą. Jis gali būti fiksuoto arba dinaminio dydžio. Kai naudojate naują raktinį žodį, JVM sukuria objekto egzempliorių krūvoje. Nors to objekto nuoroda saugoma krūvoje. Kiekvienam vykdomam JVM procesui yra tik viena krūva. Kai krūva prisipildo, šiukšlės surenkamos. Pavyzdžiui:
StringBuilder sb= new StringBuilder();
Aukščiau pateiktas teiginys sukuria „StringBuilder“ klasės objektą. Objektas priskiriamas krūvai, o nuoroda sb priskiria krūvą. Krūva yra padalinta į šias dalis:
- Jaunoji karta
- Išgyvenusiųjų erdvė
- Senoji karta
- Nuolatinė karta
- Kodo talpykla
Nuorodos tipas
Yra keturių tipų nuorodos: Stiprus , Silpnas , Minkštas , ir Fantominė nuoroda . Skirtumas tarp nuorodų tipų yra tas, kad objektai, esantys krūvoje, kuriuos jie nurodo, yra tinkami šiukšlėms rinkti pagal skirtingus kriterijus.
Stipri nuoroda: Tai labai paprasta, nes naudojame jį kasdieniame programavime. Bet koks objektas, prie kurio pritvirtinta stipri nuoroda, nėra tinkamas šiukšlių rinkimui. Galime sukurti tvirtą nuorodą naudodami šį teiginį:
StringBuilder sb= new StringBuilder();
Silpna nuoroda: Jis neišgyvena po kito šiukšlių surinkimo proceso. Jei nesame tikri, kada vėl bus prašoma duomenų. Esant tokiai sąlygai, galime sukurti silpną nuorodą į jį. Tuo atveju, jei šiukšlių surinkėjas apdoroja, jis sunaikina objektą. Kai vėl bandome gauti tą objektą, gauname nulinę reikšmę. Jis apibrėžtas java.lang.ref.WeakReference klasė. Mes galime sukurti silpną nuorodą naudodami šį teiginį:
WeakReference reference = new WeakReference(new StringBuilder());
Minkšta nuoroda: Jis renkamas, kai programai pritrūksta atminties. Šiukšlių rinktuvas nesurenka minkštai pasiekiamų daiktų. Visi minkštųjų nuorodų objektai surenkami prieš išleidžiant OutOfMemoryError. Galime sukurti minkštą nuorodą naudodami šį teiginį:
SoftReference reference = new SoftReference(new StringBuilder());
Fantominė nuoroda: Jį galima įsigyti java.lang.ref paketą. Jis apibrėžtas java.lang.ref.PhantomReference klasė. Objektą, kuriame yra tik fantominė nuoroda, nukreipianti į juos, galima surinkti, kai tik šiukšlių rinkėjas nori surinkti. Fantominę nuorodą galime sukurti naudodami šį teiginį:
PhantomReference reference = new PhantomReference(new StringBuilder());
Krūvos sritis
Stack Area sukuriama, kai sukuriama gija. Jis gali būti fiksuoto arba dinaminio dydžio. Kamino atmintis paskirstoma vienai gijai. Jis naudojamas duomenims ir daliniams rezultatams saugoti. Jame yra nuorodų į krūvos objektus. Jame taip pat yra pati reikšmė, o ne nuoroda į objektą iš krūvos. Kintamieji, kurie yra saugomi krūvoje, turi tam tikrą matomumą, vadinamą apimtimi.
Stack rėmas: Stack frame yra duomenų struktūra, kurioje yra gijos duomenys. Gijos duomenys rodo gijos būseną pagal dabartinį metodą.
- Jis naudojamas daliniams rezultatams ir duomenims saugoti. Ji taip pat atlieka dinaminį susiejimą, reikšmių grąžinimą pagal metodus ir siuntimo išimtis.
- Kai metodas iškviečiamas, sukuriamas naujas kadras. Jis sunaikina kadrą, kai metodo iškvietimas baigiamas.
- Kiekviename kadre yra savo vietinio kintamojo masyvo (LVA), operandų krūvos (OS) ir kadro duomenų (FD).
- LVA, OS ir FD dydžiai nustatyti kompiliavimo metu.
- Bet kuriame tam tikros valdymo gijos taške yra aktyvus tik vienas kadras (vykdymo metodo kadras). Šis kadras vadinamas dabartiniu kadru, o jo metodas žinomas kaip dabartinis metodas. Metodo klasė vadinama dabartine klase.
- Kadras sustabdo esamą metodą, jei jo metodas iškviečia kitą metodą arba jei metodas baigiamas.
- Gijos sukurtas rėmelis yra vietinis toje gijoje ir jo negalima nurodyti jokia kita gija.
Native Method Stack
Jis taip pat žinomas kaip C stack. Tai vietinio kodo, parašyto kita nei Java kalba, krūva. „Java Native Interface“ (JNI) iškviečia savąją steką. Savosios dėklo našumas priklauso nuo OS.
Kompiuterių registrai
Kiekviena gija turi su ja susietą programų skaitiklio (PC) registrą. Kompiuterio registre saugomas grąžinimo adresas arba vietinis žymeklis. Jame taip pat yra šiuo metu vykdomų JVM instrukcijų adresas.
Šiukšlių surinkėjo darbas
Šiukšlių surinkėjo apžvalga
Kai programa vykdoma „Java“, ji įvairiais būdais naudoja atmintį. Krūva yra atminties dalis, kurioje gyvena objektai. Tai vienintelė atminties dalis, dalyvaujanti šiukšlių surinkimo procese. Jis taip pat žinomas kaip šiukšlių surinkimas. Visas šiukšlių išvežimas užtikrina, kad krūvoje būtų kuo daugiau laisvos vietos. Šiukšlių surinkėjo funkcija yra surasti ir ištrinti objektus, kurių negalima pasiekti.
lygiavertiškumo dėsniai
Objektų paskirstymas
Kai objektas paskirstomas, JRockit JVM patikrina objekto dydį. Jis išskiria mažus ir didelius objektus. Mažas ir didelis dydis priklauso nuo JVM versijos, krūvos dydžio, šiukšlių surinkimo strategijos ir naudojamos platformos. Objekto dydis paprastai yra nuo 2 iki 128 KB.
Maži objektai saugomi Thread Local Area (TLA), kuris yra nemokama krūvos dalis. TLA nesinchronizuojama su kitomis gijomis. Kai TLA tampa pilna, ji prašo naujos TLA.
Kita vertus, dideli objektai, kurie netelpa į TLA, tiesiogiai paskirstomi į krūvą. Jei siūlas naudoja jauną erdvę, jis tiesiogiai saugomas senoje erdvėje. Didelis objektas reikalauja daugiau sinchronizavimo tarp gijų.
Ką veikia „Java“ šiukšlių surinkėjas?
JVM valdo šiukšlių surinkėją. JVM nusprendžia, kada atlikti šiukšlių išvežimą. Taip pat galime prašyti JVM paleisti šiukšlių surinkėją. Tačiau jokiomis sąlygomis nėra garantijos, kad JVM laikysis. JVM paleidžia šiukšlių rinktuvą, jei nustato, kad senka atmintis. Kai Java programa prašo šiukšlių surinkėjo, JVM paprastai patenkina užklausą greitai. Ji neužtikrina, kad prašymai būtų priimti.
Svarbu suprasti, kad ' kada objektas tampa tinkamas šiukšlių išvežimui? '
Kiekviena Java programa turi daugiau nei vieną giją. Kiekviena gija turi savo vykdymo krūvą. Java programoje yra gija, kuri yra pagrindinis () metodas. Dabar galime pasakyti, kad objektas yra tinkamas šiukšlių rinkimui, kai jokia gyva gija negali prie jo prieiti. Šiukšlių surinkėjas tą objektą laiko tinkamu naikinti. Jei programa turi nuorodos kintamąjį, kuris nurodo objektą, kuris yra prieinamas tiesioginei gijai, šis objektas vadinamas pasiekiamas .
Čia kyla klausimas, kad ' Ar Java programai gali pritrūkti atminties? '
Atsakymas yra taip. Šiukšlių surinkimo sistema bando perkelti objektus iš atminties, kai jie nenaudojami. Tačiau jei prižiūrite daug gyvų objektų, šiukšlių išvežimas negarantuoja, kad užteks atminties. Tik turima atmintis bus veiksmingai valdoma.
Šiukšlių surinkimo rūšys
Yra penki šiukšlių surinkimo tipai:
šakalas prieš vilką
Žymėjimo ir šlavimo algoritmas
JRockit JVM šiukšlių surinkimui naudoja žymėjimo ir valymo algoritmą. Jį sudaro dvi fazės: žymėjimo fazė ir šlavimo fazė.
Žymėjimo fazė: Objektai, pasiekiami iš gijų, vietinių rankenų ir kitų GC šakninių šaltinių, pažymėti kaip gyvi. Kiekvienas objektinis medis turi daugiau nei vieną šakninį objektą. GC šaknis visada pasiekiama. Taigi bet koks objektas, kurio šaknyje yra šiukšlių surinkimo šaknis. Jis identifikuoja ir pažymi visus naudojamus objektus, o likusieji gali būti laikomi šiukšlėmis.
Šlavimo fazė: Šioje fazėje perkeliama krūva, siekiant rasti tarpą tarp gyvų objektų. Šios spragos yra įrašytos į laisvąjį sąrašą ir yra prieinamos naujų objektų paskirstymui.
Yra dvi patobulintos žymėjimo ir šlavimo versijos:
Vienu metu pažymėkite ir nuvalykite
Tai leidžia sriegiams toliau veikti per didelę šiukšlių surinkimo dalį. Yra šie žymėjimo tipai:
Lygiagretus žymėjimas ir šlavimas
Jis naudoja visą turimą CPU sistemoje, kad šiukšles būtų surinktos kuo greičiau. Jis taip pat vadinamas lygiagrečiu šiukšlių surinkėju. Gijos nevykdomos, kai vykdomas lygiagretus šiukšlių rinkimas.
„Mark and Sweep“ pranašumai
- Tai pasikartojantis procesas.
- Tai begalinė kilpa.
- Vykdant algoritmą neleidžiamos papildomos pridėtinės išlaidos.
„Mark and Sweep“ trūkumai
nustatyta java
- Tai sustabdo įprastą programos vykdymą, kol veikia šiukšlių surinkimo algoritmas.
- Programoje jis veikia kelis kartus.