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:
- gomila
- Stog
- Code
- 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.
Varijabla X u m1 takoฤer ฤe biti kreirana u okviru za m1 u stogu. (Pogledajte sliku ispod).
Metoda m1 poziva metodu m2. U stack Javi, kreira se novi okvir za m2 na vrhu okvira m1.
Varijable b i c takoฤer ฤe biti kreirane u okviru m2 u hrpi.
public void m2(int b){
boolean c;
}
Ista metoda m2 poziva metodu m3. Opet se stvara okvir m3 na vrhu hrpe (pogledajte sliku ispod).
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.
Referentna varijabla "ref" bit ฤe stvorena u stack Javi.
Operator dodjele โ=โ napravit ฤe referentnu varijablu koja pokazuje na objekt u hrpi.
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.
Stog iz metode m3 ฤe se isprati.
Buduฤi da referentna varijabla viลกe neฤe upuฤivati โโna objekt u hrpi, bila bi prihvatljiva za skupljanje smeฤa.
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.
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.
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.
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.
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.
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.
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.



















