Muistinhallinta sisään Java
Mikä on pinomuisti?
Java-pino on muistin osa, joka sisältää menetelmiä, paikallisia muuttujia ja viitemuuttujia. Pinomuistiin viitataan aina Last-In-First-Out -järjestyksessä. Paikalliset muuttujat luodaan pinoon.
Mikä on kasamuisti?
Keko on muistin osa, joka sisältää objekteja ja voi sisältää myös viitemuuttujia. Instanssimuuttujat luodaan kasaan.
Muistin varaus sisään Java
Muistin varaus sisään Java on prosessi, jossa virtuaalimuistin osat asetetaan sivuun ohjelmassa rakenteiden ja luokkien muuttujien ja ilmentymien tallentamiseksi. Muistia ei kuitenkaan varata objektille määrityksen yhteydessä, vaan luodaan vain viittaus. Objektin muistin varaamiseen käytetään new()-menetelmää, joten objektille varataan aina muistia kasaan.
- Java Muistin varaus on jaettu seuraaviin osiin:
- pino
- Pinota
- Koodi
- Staattinen
Tätä muistin jakoa tarvitaan sen tehokkaaseen hallintaan.
- - koodi osio sisältää sinun tavukoodi.
- - Pinota osa muistista sisältää menetelmät, paikalliset muuttujat ja viitemuuttujat.
- - pino jakso sisältää Esineet (voi sisältää myös viitemuuttujia).
- - Staattinen jakso sisältää Staattiset tiedot/menetelmät.
Ero paikallisen ja ilmentymämuuttujan välillä
Esimerkki muuttuja ilmoitetaan luokan sisällä, mutta ei metodin sisällä
class Student{ int num; // num is instance variable public void showData{}
Paikallinen muuttuja julistetaan sisällä a menetelmä mukaan lukien menetelmä perustelut.
public void sum(int a){ int x = int a + 3; // a , x are local variables; }
Ero pinon ja kasan välillä
Napauta tätä jos video ei ole saatavilla
Otetaan esimerkki ymmärtääksemme tätä paremmin. Ajattele, että päämenetelmäsi kutsuu menetelmää m1
public void m1{ int x=20 }
Pinossa javassa kehys luodaan menetelmästä m1.
Muuttuja X m1:ssä luodaan myös pinossa olevan m1:n kehykseen. (Katso kuva alla).
Menetelmä m1 kutsuu menetelmää m2. Pino Javassa luodaan uusi kehys m2:lle kehyksen m1 päälle.
Muuttujat b ja c luodaan myös kehykseen m2 pinossa.
public void m2(int b){ boolean c; }
Sama menetelmä m2 kutsuu menetelmää m3. Jälleen pinon päälle luodaan kehys m3 (katso kuva alla).
Sanotaan nyt, että menetelmämme m3 luo objektin luokalle "Account", jolla on kaksi esiintymien muuttuja int p ja int q.
Account { Int p; Int q; }
Tässä on koodi menetelmälle m3
public void m3(){ Account ref = new Account(); // more code }
Lausunto new Account() luo tiliobjektin kasaan.
Viitemuuttuja "ref" luodaan pinossa javassa.
Määritys "="-operaattori tekee viitemuuttujan osoittamaan keon objektiin.
Kun menetelmä on suorittanut suorituksensa. Ohjausvirta palaa kutsumenetelmään. Mikä tässä tapauksessa on menetelmä m2.
Menetelmän m3 pino huuhdellaan pois.
Koska viitemuuttuja ei enää osoita kasan objektiin, se olisi kelvollinen roskien keräämiseen.
Kun menetelmä m2 on suorittanut suorituksensa. Se ponnahtaa ulos pinosta, ja kaikki sen muuttujat huuhdellaan eikä ole enää käytettävissä.
Samoin menetelmälle m1.
Lopulta ohjausvirta palaa ohjelman aloituspisteeseen. Mikä yleensä on "päämenetelmä".
Entä jos Objectin esiintymämuuttujana on viittaus?
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 }
Tässä tapauksessa viitemuuttuja "child" luodaan kasaan, joka puolestaan osoittaa objektiinsa, kuten alla esitetyssä kaaviossa.
Mitä roskakeräys sisältää Java?
Roskakeräys sisään Java on prosessi, jossa ohjelmat suorittavat muistinhallinnan automaattisesti. Garbage Collector (GC) löytää käyttämättömät kohteet ja poistaa ne palauttaakseen muistin. sisään Java, objektien dynaaminen muistin varaus saadaan aikaan käyttämällä uutta operaattoria, joka käyttää jonkin verran muistia ja muisti pysyy varattuna, kunnes objektin käyttöön on viitteitä.
Kun objektiin ei ole viittauksia, oletetaan, että sitä ei enää tarvita ja objektin varaama muisti voidaan ottaa takaisin. Ei ole nimenomaista tarvetta tuhota esinettä Java hoitaa varauksen purkamisen automaattisesti.
Tämän saavuttava tekniikka tunnetaan nimellä Roskakokoelma. Ohjelmat, jotka eivät poista muistin varausta, voivat lopulta kaatua, kun järjestelmässä ei ole varattavaa muistia. Näillä ohjelmilla sanotaan olevan muistivuotoja. Roskien keräys sisään Java tapahtuu automaattisesti ohjelman elinkaaren aikana, mikä eliminoi tarpeen purkaa muistia ja siten välttää muistivuotoja.
C-kielessä ohjelmoijan vastuulla on purkaa muisti, joka on varattu dynaamisesti free()-funktiolla. Tämä on paikka Java muistinhallintajohdot.
Huomautus: Kaikki objektit luodaan muistin Keko-osioon. Tästä lisää myöhemmässä opetusohjelmassa.
Esimerkki: Roskienkeräysmekanismin oppiminen Java
Vaihe 1) Kopioi seuraava koodi editoriin.
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(); } }
Vaihe 2) Tallenna, käännä ja suorita koodi. Kuten kaaviosta näkyy, luodaan kaksi objektia ja kaksi viitemuuttujaa.
Vaihe 3) Kommentoimaton rivi # 20,21,22. Tallenna, käännä ja suorita koodi.
Vaihe 4) Kuten alla olevassa kaaviossa näkyy, kaksi viitemuuttujaa osoittavat samaan objektiin.
Vaihe 5) Kommentoi rivit # 23 & 24. Käännä, tallenna ja suorita koodi
Vaihe 6) Kuten alla olevasta kaaviosta näkyy, s2 muuttuu tyhjäksi, mutta s3 osoittaa edelleen objektiin eikä ole kelvollinen Java-roskien keräämiseen.
Vaihe 7) Poista kommentit riviltä 25 ja 26. Tallenna, käännä ja suorita koodi
Vaihe 8) Tässä vaiheessa ei ole viittauksia, jotka osoittavat esineeseen, ja se on kelvollinen roskien keräykseen. Se poistetaan muistista, eikä sitä voi palauttaa millään tavalla.
Kuinka poistaa esine Java?
1) Jos haluat tehdä esineestäsi roskakeräyksen kelvollisen, määritä sen viitemuuttuja arvoksi null.
2) Primitiivityypit eivät ole esineitä. Niitä ei voi määrittää nolla-arvoiksi.
Yhteenveto:
- Kun menetelmää kutsutaan, pinon päälle luodaan kehys.
- Kun menetelmä on suorittanut loppuun, ohjausvirta palaa kutsuvaan menetelmään ja sitä vastaava pinokehys tyhjennetään.
- Paikalliset muuttujat luodaan pinoon
- Ilmentymämuuttujat luodaan kasaan ja ovat osa objektia, johon ne kuuluvat.
- Viitemuuttujat luodaan pinoon.