logo

Atminties valdymas Java

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 Šiukšlių surinkėjo darbas

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.

Atminties valdymas Java

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ą
    Serijos GC:Jame naudojamas „mark and sweeps“ metodas, skirtas jaunoms ir senoms kartoms, o tai yra nedidelė ir pagrindinė GC.Lygiagretus GC:Jis panašus į serijinį GC, išskyrus tai, kad jis sukuria N (procesoriaus branduolių skaičius sistemoje) gijų, skirtų jaunosios kartos šiukšlių surinkimui.Lygiagretus senas GC:Jis panašus į lygiagrečią GC, išskyrus tai, kad naudoja kelias gijas abiem kartoms.Lygiagretusis Mark Sweep (TVS) kolektorius:Tai atlieka šiukšlių išvežimą senajai kartai. Galite apriboti TVS rinktuvo gijų skaičių naudodami XX:ParalleCMSThreads=JVM parinktis . Jis taip pat žinomas kaip „Concurrent Low Pause Collector“.G1 šiukšlių surinkėjas:Jis įdiegtas Java 7. Jos tikslas yra pakeisti TVS kolektorius. Tai lygiagretusis, lygiagretusis ir TVS kolektorius. Čia nėra jaunosios ir senosios kartos erdvės. Jis padalija krūvą į keletą vienodo dydžio krūvų. Pirmiausia renkami regionai, kuriuose yra mažiau tiesioginių duomenų.

Ž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.

Atminties valdymas Java

Š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 Lygiagretus žymėjimas ir šlavimas

Vienu metu pažymėkite ir nuvalykite

Tai leidžia sriegiams toliau veikti per didelę šiukšlių surinkimo dalį. Yra šie žymėjimo tipai:

    Pradinis žymėjimas:Jis identifikuoja gyvų objektų šaknį. Tai daroma, kai gijos yra pristabdytos.Lygiagretusis žymėjimas:Šiame žymėjime vadovaujamasi nuoroda iš šakninio rinkinio. Jis suranda ir pažymi likusius gyvus objektus krūvoje. Tai daroma, kol gija veikia.Išankstinio valymo žymėjimas:Jis identifikuoja pakeitimus, padarytus vienu metu žymint. Kiti gyvi objektai pažymėti ir rasti. Tai daroma, kol gijos veikia.Galutinis žymėjimas:Jis identifikuoja pakeitimus, padarytus žymint išankstinį valymą. Kiti gyvi objektai pažymėti ir rasti. Tai daroma, kai gijos yra pristabdytos.

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.