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:

  1. pino
  2. Pinota
  3. Koodi
  4. 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.

Java Pino ja kasa

Muuttuja X m1:ssä luodaan myös pinossa olevan m1:n kehykseen. (Katso kuva alla).

Java Pino ja kasa

Menetelmä m1 kutsuu menetelmää m2. Pino Javassa luodaan uusi kehys m2:lle kehyksen m1 päälle.

Java Pino ja kasa

Java Pino ja kasa

Muuttujat b ja c luodaan myös kehykseen m2 pinossa.

public void m2(int b){
boolean c;
}

Java Pino ja kasa

Sama menetelmä m2 ​​kutsuu menetelmää m3. Jälleen pinon päälle luodaan kehys m3 (katso kuva alla).

Java Pino ja kasa

Java Pino ja kasa

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.

Java Pino ja kasa

Viitemuuttuja "ref" luodaan pinossa javassa.

Java Pino ja kasa

Määritys "="-operaattori tekee viitemuuttujan osoittamaan keon objektiin.

Java Pino ja kasa

Kun menetelmä on suorittanut suorituksensa. Ohjausvirta palaa kutsumenetelmään. Mikä tässä tapauksessa on menetelmä m2.

Java Pino ja kasa

Menetelmän m3 pino huuhdellaan pois.

Java Pino ja kasa

Koska viitemuuttuja ei enää osoita kasan objektiin, se olisi kelvollinen roskien keräämiseen.

Java Pino ja kasa

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.

Java Pino ja kasa

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.


Jätteenkeräysmekanismi

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.

Jätteenkeräysmekanismi

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.

Jätteenkeräysmekanismi

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.

Opi roskienkerääjä

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.

Kuinka poistaa esine Java

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.