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:

  1. hunnik
  2. Stack
  3. kood
  4. 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.

Java Virna ja kuhja

Muutuja X m1-s luuakse ka virna m1 raamis. (Vaata pilti allpool).

Java Virna ja kuhja

Meetod m1 on meetodi m2 kutsumine. Pinu javas luuakse m2 jaoks uus kaader kaadri m1 peale.

Java Virna ja kuhja

Java Virna ja kuhja

Muutujad b ja c luuakse ka kaadris m2 virnas.

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

Java Virna ja kuhja

Sama meetod m2 kutsub meetodit m3. Jälle luuakse virna ülaossa raam m3 (vt allolevat pilti).

Java Virna ja kuhja

Java Virna ja kuhja

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

Java Virna ja kuhja

Võrdlusmuutuja "ref" luuakse virnas java.

Java Virna ja kuhja

Määramise operaator “=” loob võrdlusmuutuja, mis osutab kuhjas olevale objektile.

Java Virna ja kuhja

Kui meetod on täitmise lõpule viinud. Juhtimisvoog naaseb helistamismeetodile. Mis antud juhul on meetod m2.

Java Virna ja kuhja

Meetodi m3 virn loputatakse välja.

Java Virna ja kuhja

Kuna võrdlusmuutuja ei osuta enam hunnikus olevale objektile, oleks see prügikoristuskõlblik.

Java Virna ja kuhja

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.

Java Virna ja kuhja

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.


Prügi kogumise mehhanism

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.

Prügi kogumise mehhanism

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.

Prügi kogumise mehhanism

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.

Õppige prügikogujat

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.

Kuidas objekti kustutada Java

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.