Upravljanje memorijom u Java

ล to je Stack Memory?

Stog u Javi je dio memorije koji sadrลพi metode, lokalne varijable i referentne varijable. Memorija skupa uvijek se navodi redoslijedom zadnji uลกao-prvi-iziลกao. Lokalne varijable se stvaraju u stogu.

ล to je Heap memorija?

Hrpa je dio memorije koji sadrลพi objekte i moลพe sadrลพavati i referentne varijable. Varijable instance stvaraju se u gomili.

Dodjela memorije u Java

Dodjela memorije u Java je proces u kojem se odjeljci virtualne memorije izdvajaju u programu za pohranjivanje varijabli i instanci struktura i klasa. Meฤ‘utim, memorija se ne dodjeljuje objektu prilikom deklaracije, veฤ‡ se stvara samo referenca. Za dodjelu memorije objektu koristi se metoda new(), tako da se objektu uvijek dodjeljuje memorija na gomili.

The Java Dodjela memorije podijeljena je na sljedeฤ‡e dijelove:

  1. gomila
  2. Stog
  3. Code
  4. statiฤki

Ova podjela memorije je potrebna za njeno uฤinkovito upravljanje.

  • The kod odjeljak sadrลพi vaลกe bajt.
  • The Stog dio memorije sadrลพi metode, lokalne varijable i referentne varijable.
  • The gomila odjeljak sadrลพi objekti (moลพe sadrลพavati i referentne varijable).
  • The statiฤki odjeljak sadrลพi Statiฤki podaci/metode.

Razlika izmeฤ‘u lokalne i varijable instance

Instanca varijabla proglaลกava se unutar klase, ali ne unutar metode

class Student{ 
int num; // num is  instance variable 
public void showData{}

Lokalna varijabla se deklariraju u a metoda ukljuฤujuฤ‡i naฤin argumenti.

public void sum(int a){

int x = int a +  3;

// a , x are local variables;

}

Razlika izmeฤ‘u hrpe i gomile

Kliknite ovdje ako video nije dostupan

Uzmimo primjer da ovo bolje razumijemo. Smatrajte da vaลกa glavna metoda poziva metodu m1

public void m1{
int x=20
}

U stack Javi, okvir ฤ‡e biti kreiran iz metode m1.

Java Stog i gomila

Varijabla X u m1 takoฤ‘er ฤ‡e biti kreirana u okviru za m1 u stogu. (Pogledajte sliku ispod).

Java Stog i gomila

Metoda m1 poziva metodu m2. U stack Javi, kreira se novi okvir za m2 na vrhu okvira m1.

Java Stog i gomila

Java Stog i gomila

Varijable b i c takoฤ‘er ฤ‡e biti kreirane u okviru m2 u hrpi.

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

Java Stog i gomila

Ista metoda m2 poziva metodu m3. Opet se stvara okvir m3 na vrhu hrpe (pogledajte sliku ispod).

Java Stog i gomila

Java Stog i gomila

Recimo sada da naลกa metoda m3 stvara objekt za klasu "Raฤun", koja ima dva instance varijable int p i int q.

Account {
             Int p;
             Int q;
       }

Ovdje je kod za metodu m3

public void m3(){
	Account ref = new Account();
	// more code
}

Izjava new Account() ฤ‡e stvoriti objekt raฤuna u gomili.

Java Stog i gomila

Referentna varijabla "ref" bit ฤ‡e stvorena u stack Javi.

Java Stog i gomila

Operator dodjele โ€œ=โ€ napravit ฤ‡e referentnu varijablu koja pokazuje na objekt u hrpi.

Java Stog i gomila

Nakon ลกto je metoda zavrลกila svoje izvrลกenje. Tijek kontrole vratit ฤ‡e se na metodu pozivanja. ล to je u ovom sluฤaju metoda m2.

Java Stog i gomila

Stog iz metode m3 ฤ‡e se isprati.

Java Stog i gomila

Buduฤ‡i da referentna varijabla viลกe neฤ‡e upuฤ‡ivati โ€‹โ€‹na objekt u hrpi, bila bi prihvatljiva za skupljanje smeฤ‡a.

Java Stog i gomila

Nakon ลกto je metoda m2 zavrลกila svoje izvrลกenje. Bit ฤ‡e izvuฤen iz stoga, a sve njegove varijable bit ฤ‡e isprane i viลกe neฤ‡e biti dostupne za koriลกtenje.

Isto tako za metodu m1.

Na kraju ฤ‡e se tok kontrole vratiti na poฤetnu toฤku programa. ล to je obiฤno "glavna" metoda.

ล to ako Object ima referencu kao varijablu instance?

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 }

U ovom sluฤaju, referentna varijabla "dijete" bit ฤ‡e stvorena u gomili, koja ฤ‡e zauzvrat upuฤ‡ivati โ€‹โ€‹na svoj objekt, neลกto poput dijagrama prikazanog u nastavku.

Java Stog i gomila

U ฤemu je Garbage Collection Java?

Odvoz smeฤ‡a u Java je proces kojim programi automatski upravljaju memorijom. Skupljaฤ smeฤ‡a (GC) pronalazi neiskoriลกtene objekte i briลกe ih kako bi povratio memoriju. U Java, dinamiฤka dodjela memorije objekata postiลพe se koriลกtenjem novog operatora koji koristi neลกto memorije, a memorija ostaje dodijeljena dok ne postoje reference za koriลกtenje objekta.

Kada nema referenci na objekt, pretpostavlja se da viลกe nije potreban, a memorija koju je objekt zauzeo moลพe se vratiti. Ne postoji izriฤita potreba za uniลกtavanjem objekta kao Java automatski upravlja de-alokacijom.

Tehnika kojom se to postiลพe poznata je kao Kolekcija smeฤ‡a. Programi koji ne poniลกtavaju raspodjelu memorije mogu se s vremenom sruลกiti ako u sustavu viลกe nema memorije za dodjelu. Reฤeno je da ovi programi imaju curenje memorije. Odvoz smeฤ‡a u Java dogaฤ‘a automatski tijekom ลพivotnog vijeka programa, eliminirajuฤ‡i potrebu de-alokacije memorije i time izbjegavajuฤ‡i curenje memorije.

U jeziku C odgovornost je programera da de-alocira memoriju koja se dinamiฤki dodjeljuje pomoฤ‡u funkcije free(). Ovdje je Java vodi upravljanje memorijom.

Biljeลกka: Svi se objekti stvaraju u odjeljku Heap memorije. Viลกe o tome u kasnijem vodiฤu.

Primjer: Nauฤiti mehanizam skupljaฤa smeฤ‡a u Java

Korak 1) Kopirajte sljedeฤ‡i kod u editor.

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();
  }
}

Korak 2) Spremite, prevedite i pokrenite kod. Kao ลกto je prikazano na dijagramu, stvorena su dva objekta i dvije referentne varijable.


 Mehanizam sakupljaฤa smeฤ‡a

Korak 3) Odkomentirajte redak # 20,21,22. Spremite, prevedite i pokrenite kod.

Korak 4) Kao ลกto je prikazano na donjem dijagramu, dvije referentne varijable pokazuju na isti objekt.

Mehanizam sakupljaฤa smeฤ‡a

Korak 5) Odkomentirajte retke # 23 i 24. Prevedite, spremite i pokrenite kod

Korak 6) Kao ลกto je prikazano na donjem dijagramu, s2 postaje null, ali s3 joลก uvijek pokazuje na objekt i nije prikladan za Java skupljanje smeฤ‡a.

 Mehanizam sakupljaฤa smeฤ‡a

Korak 7) Odkomentirajte retke br. 25 i 26. Spremite, kompajlirajte i pokrenite Code

Korak 8) U ovom trenutku nema referenci koje upuฤ‡uju na objekt i postaje prihvatljiv za skupljanje smeฤ‡a. Bit ฤ‡e uklonjeno iz memorije i ne postoji naฤin da se vrati.

 Nauฤite skupljaฤa smeฤ‡a

Kako izbrisati objekt u Java?

1) Ako ลพelite svoj objekt uฤiniti podobnim za sakupljanje smeฤ‡a, dodijelite njegovu referentnu varijablu na null.

2) Primitivni tipovi nisu objekti. Ne moลพe im se dodijeliti null.

Kako izbrisati objekt u Java

Saลพetak:

  • Kada se pozove metoda, okvir se stvara na vrhu stoga.
  • Nakon ลกto je metoda zavrลกila s izvoฤ‘enjem, tok kontrole vraฤ‡a se na pozivnu metodu i njen odgovarajuฤ‡i okvir steka se ispire.
  • Lokalne varijable se stvaraju u stogu
  • Varijable instance stvaraju se u gomili i dio su objekta kojem pripadaju.
  • Referentne varijable se kreiraju u stogu.

Saลพmite ovu objavu uz: