Mäluhaldus sisse Java
Mis on virnamälu?
Java virn on mälu osa, mis sisaldab meetodeid, kohalikke muutujaid ja võrdlusmuutujaid. Virnamälule viidatakse alati järjekorras Last-In-First-Out. Kohalikud muutujad luuakse virnas.
Mis on kuhjamälu?
Kuhja on mälu osa, mis sisaldab objekte ja võib sisaldada ka võrdlusmuutujaid. Kuhjas luuakse eksemplarimuutujad.
Mälu eraldamine sisse Java
Mälu eraldamine sisse Java on protsess, mille käigus virtuaalse mälu sektsioonid eraldatakse programmis struktuuride ja klasside muutujate ja eksemplaride salvestamiseks. Mälu ei eraldata aga deklareerimisel objektile, vaid luuakse ainult viide. Objekti mälu eraldamiseks kasutatakse meetodit new(), seega eraldatakse objektile alati kuhja mälu.
. Java Mälu eraldamine on jagatud järgmisteks osadeks:
- hunnik
- Stack
- kood
- Staatiline
Selline mälujaotus on vajalik selle tõhusaks haldamiseks.
- . kood jaotis sisaldab teie baitkood.
- . Stack mäluosa sisaldab meetodid, kohalikud muutujad ja võrdlusmuutujad.
- . hunnik jaotis sisaldab Objektid (võib sisaldada ka viitemuutujaid).
- . Staatiline jaotis sisaldab Staatilised andmed/meetodid.
Erinevus kohaliku ja eksemplari muutuja vahel
Eksemplari muutuja deklareeritakse klassi sees, kuid mitte meetodi sees
class Student{ int num; // num is instance variable public void showData{}
Kohalik muutuja deklareeritakse sees a meetod, sealhulgas meetod argumendid.
public void sum(int a){ int x = int a + 3; // a , x are local variables; }
Erinevus virna ja kuhja vahel
Click siin kui video pole juurdepääsetav
Selle paremaks mõistmiseks võtame näite. Mõelge, et teie peamine meetod kutsub meetodit m1
public void m1{ int x=20 }
Viru javas luuakse raam meetodist m1.
Muutuja X m1-s luuakse ka virna m1 raamis. (Vaata pilti allpool).
Meetod m1 on meetodi m2 kutsumine. Pinu javas luuakse m2 jaoks uus kaader kaadri m1 peale.
Muutujad b ja c luuakse ka kaadris m2 virnas.
public void m2(int b){ boolean c; }
Sama meetod m2 kutsub meetodit m3. Jälle luuakse virna ülaossa raam m3 (vt allolevat pilti).
Ütleme nüüd, et meie meetod m3 loob objekti klassile “Konto”, millel on kaks esinemisjuhtude muutuja int p ja int q.
Account { Int p; Int q; }
Siin on meetodi m3 kood
public void m3(){ Account ref = new Account(); // more code }
Väljavõte new Account() loob hunnikus kontoobjekti.
Võrdlusmuutuja "ref" luuakse virnas java.
Määramise operaator “=” loob võrdlusmuutuja, mis osutab kuhjas olevale objektile.
Kui meetod on täitmise lõpule viinud. Juhtimisvoog naaseb helistamismeetodile. Mis antud juhul on meetod m2.
Meetodi m3 virn loputatakse välja.
Kuna võrdlusmuutuja ei osuta enam hunnikus olevale objektile, oleks see prügikoristuskõlblik.
Kui meetod m2 on täitmise lõpetanud. See hüppatakse virnast välja ja kõik selle muutujad kustutatakse ja pole enam kasutamiseks saadaval.
Samamoodi meetodi m1 puhul.
Lõpuks naaseb juhtimisvoog programmi alguspunkti. Mis tavaliselt on "peamine" meetod.
Mis siis, kui objektil on eksemplarimuutujana viide?
public static void main(String args[]) { A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d; //more code }
Sel juhul luuakse võrdlusmuutuja "child" hunnikus, mis omakorda osutab oma objektile, umbes nagu allpool näidatud diagrammil.
Mis on prügikoristus Java?
Prügi kogumine sisse Java on protsess, mille käigus programmid teostavad mäluhaldust automaatselt. Prügikoguja (GC) leiab kasutamata objektid ja kustutab need mälu taastamiseks. sisse Java, objektide dünaamiline mälujaotus saavutatakse uue operaatori abil, mis kasutab natuke mälu ja mälu jääb eraldatuks seni, kuni on olemas viited objekti kasutamiseks.
Kui objektile viiteid pole, eeldatakse, et seda pole enam vaja ja objekti poolt hõivatud mälu saab taastada. Objekti hävitamiseks pole selget vajadust Java tegeleb eraldamise automaatselt.
Tehnika, mis seda saavutab, on tuntud kui Prügikogu. Programmid, mis mälu ei eralda, võivad lõpuks kokku kukkuda, kui süsteemis pole eraldamiseks enam mälu. Väidetavalt on neil programmidel mälulekked. Prügi kogumine sisse Java toimub automaatselt programmi eluea jooksul, välistades vajaduse mälu eraldada ja seeläbi vältida mälulekkeid.
C-keeles vastutab programmeerija dünaamiliselt eraldatud mälu eraldamise eest, kasutades funktsiooni free(). See on koht Java mäluhaldusjuhtmed.
Märge: Kõik objektid luuakse mälus Heap Section. Lisateavet selle kohta hilisemas õpetuses.
Näide: Prügikogumismehhanismi õppimiseks Java
Step 1) Kopeerige järgmine kood redaktorisse.
class Student{ int a; int b; public void setData(int c,int d){ a=c; b=d; } public void showData(){ System.out.println("Value of a = "+a); System.out.println("Value of b = "+b); } public static void main(String args[]){ Student s1 = new Student(); Student s2 = new Student(); s1.setData(1,2); s2.setData(3,4); s1.showData(); s2.showData(); //Student s3; //s3=s2; //s3.showData(); //s2=null; //s3.showData(); //s3=null; //s3.showData(); } }
Step 2) Salvestage, kompileerige ja käivitage kood. Nagu diagrammil näidatud, luuakse kaks objekti ja kaks võrdlusmuutujat.
Step 3) Kommenteerimata rida # 20,21,22. Salvestage, kompileerige ja käivitage kood.
Step 4) Nagu on näidatud alloleval diagrammil, osutavad kaks võrdlusmuutujat samale objektile.
Step 5) Tühista ridade # 23 ja 24 kommentaarid. Kompileerige, salvestage ja käivitage kood
Step 6) Nagu on näidatud alloleval diagrammil, muutub s2 nulliks, kuid s3 osutab endiselt objektile ja ei sobi Java prügi kogumiseks.
Step 7) Tühista kommentaaride read # 25 ja 26. Salvestage, kompileerige ja käivitage kood
Step 8) Siinkohal puuduvad objektile viitavad viited ja see muutub prügiveokõlblikuks. See eemaldatakse mälust ja seda pole enam võimalik tagasi tuua.
Kuidas objekti kustutada Java?
1) Kui soovite muuta oma objekti prügiveo jaoks sobivaks, määrake selle viitemuutuja väärtuseks null.
2) Primitiivsed tüübid ei ole objektid. Neid ei saa määrata nulliks.
Kokkuvõte:
- Meetodi kutsumisel luuakse virna ülaossa raam.
- Kui meetodi täitmine on lõpule viidud, naaseb juhtimisvoog kutsumismeetodi juurde ja sellele vastav virnaader kustutatakse.
- Kohalikud muutujad luuakse virnas
- Eksemplarimuutujad luuakse kuhjas ja on osa objektist, kuhu nad kuuluvad.
- Viitemuutujad luuakse virnas.