Mis on korstmälu?
Stack in java on osa mälust, mis sisaldab meetodeid, kohalikke muutujaid ja võrdlusmuutujaid. Korstmälule viidatakse alati järjekorras Viimane sisse-esimesena. Virnas luuakse lokaalsed muutujad.
Mis on kuhjamälu?
Heap on mälu osa, mis sisaldab objekte ja võib sisaldada ka viitemuutujaid. Eksemplari muutujad luuakse kuhja
Mälu eraldamine Java-s
Mälu jaotamine Java-s on protsess, mille käigus virtuaalmälu sektsioonid eraldatakse programmis muutujate ning struktuuride ja klasside eksemplaride salvestamiseks. Mälu ei eraldata deklaratsiooni objektile, vaid luuakse ainult viide. Objekti mälu eraldamiseks kasutatakse meetodit new (), seega eraldatakse objektile alati kuhjaga mälu.
Java mälu jaotamine on jagatud järgmisteks osadeks:
- Hunnik
- Virn
- Kood
- Staatiline
Seda mälujaotust on vaja selle tõhusaks haldamiseks.
- Koodi lõik sisaldab oma bytecode .
- Stack osa mälu sisaldab meetodeid, kohalike muutujate ja baasmuutujaid.
- Heap jaos sisaldab esemeid (võivad sisaldada ka baasmuutujaid).
- Staatiline jaos sisaldab Staatiline andmeid / meetodeid .
Kohaliku ja eksemplari muutuja erinevus
Eksemplari muutuja deklareeritakse klassi sees, kuid mitte meetodi sees
class Student{int num; // num is instance variablepublic void showData{}
Kohalik muutuja on deklareeritud sees meetod sealhulgas meetod argumendid .
public void sum(int a){int x = int a + 3;// a , x are local variables;}
Virna ja kuhja erinevus
Kui videole pole juurdepääsu, klõpsake siin
Võtame näite, et sellest paremini aru saada.
Mõelge, et teie peamine meetod helistab meetodile m1
public void m1{int x=20}
Virna Java-s luuakse raam meetodist m1.
Muutuja X m1-s luuakse ka virna m1 kaadrisse. (Vaata pilti allpool).
Meetod m1 kutsub meetodit m2. Virna Java-s luuakse m2 jaoks uus raam raami 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ällegi luuakse virna ülaosale raam m3 (vt allolevat pilti).
Oletagem nüüd, et meie meetod m3 loob klassi "Konto" objekti, millel on kaks muutujat int p ja int q.
Account {Int p;Int q;}
Siin on meetodi m3 kood
public void m3(){Account ref = new Account();// more code}
Avaldus uus konto () loob kuhjaga kontoobjekti.
Referentsmuutuja "ref" luuakse virna Java-s.
Omistus operaator teeb võrdlusmuutuja, mis osutab kuhjas olevale objektile.
Kui meetod on selle täitmise lõpetanud. Juhtimisvoog läheb tagasi helistamismeetodi juurde. Mis on antud juhul meetod m2.
Meetodi m3 virn loputatakse välja.
Kuna võrdlusmuutuja ei osuta enam kuhjas olevale objektile, oleks see sobilik prügiveoks.
Kui meetod m2 on selle täitmise lõpetanud. See hüpatakse virnast välja ja kogu selle muutuja loputatakse ja pole enam kasutamiseks saadaval.
Samamoodi meetodi m1 puhul.
Lõpuks naaseb juhtimisvoog programmi alguspunkti. Mis tavaliselt on "peamine" meetod.
Mis siis, kui objekti objektimuutujana on 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 }
Sellisel juhul luuakse võrdlusmuutuja "laps" kuhjaga, mis omakorda osutab oma objektile, umbes nagu allpool näidatud diagramm.
Kokkuvõte:
- Meetodi kutsumisel luuakse virna ülaossa raam.
- Kui meetod on täitmise lõpetanud, naaseb juhtimisvoog kutsemeetodisse ja sellele vastav virna raam loputatakse.
- Virnas luuakse lokaalsed muutujad
- Eksemplari muutujad luuakse kuhjaga ja need on osa objektist, kuhu nad kuuluvad.
- Virnas luuakse võrdlusmuutujad.