Mi a verem memória?
A verem a java-ban a memória egy része, amely módszereket, helyi változókat és referenciaváltozókat tartalmaz. A verem memóriájára mindig az utolsó-az-első-kimenet sorrendben hivatkozunk. A veremben helyi változók jönnek létre.
Mi a halom memória?
A halom a memória egy része, amely objektumokat tartalmaz, és referenciaváltozókat is tartalmazhat. A példányváltozók a kupacban jönnek létre
Memória allokáció Java-ban
A memória allokációja a Java-ban az a folyamat, amelyben a virtuális memória szakaszokat egy programban különítik el a változók és a struktúrák és osztályok példányainak tárolására. A memória azonban nincs kijelölve egy objektumhoz, csak egy hivatkozás jön létre. Az objektum memória-allokációjához új () metódust használnak, így az objektumhoz mindig memória tartozik a kupacban.
A Java memória kiosztása a következő szakaszokra oszlik:
- Halom
- Kazal
- Kód
- Statikus
Ez a memóriafelosztás szükséges a hatékony kezeléséhez.
- A kód szakasz tartalmazza a bájtkódodat .
- A memória Halom szakasza metódusokat, helyi változókat és referenciaváltozókat tartalmaz.
- A Halom szakasz Objektumokat tartalmaz (referenciaváltozókat is tartalmazhat).
- A Statikus szakasz Statikus adatokat / módszereket tartalmaz .
Különbség a helyi és a példányváltozó között
A példányváltozó deklarálva van egy osztályon belül, de nem egy metóduson belül
class Student{int num; // num is instance variablepublic void showData{}
A helyi változót egy metóduson belül deklaráljuk , beleértve a metódus argumentumokat .
public void sum(int a){int x = int a + 3;// a , x are local variables;}
Különbség Stack és Heap között
Kattintson ide, ha a videó nem érhető el
Vegyünk egy példát, hogy ezt jobban megértsük.
Fontolja meg, hogy az m1 metódus hívásának fő módszere
public void m1{int x=20}
A verem java-ban egy keretet hozunk létre az m1 módszerből.
Az m1-ben szereplő X változó szintén létrejön az verem m1-es keretében. (Lásd az alábbi képet).
Az m1 módszer az m2 metódust hívja meg. A verem java-ban egy új keret jön létre az m2 számára az m1 keret tetején.
A b és c változó szintén létrejön egy m2 keretben, veremben.
public void m2(int b){boolean c;}
Ugyanaz az m2 módszer hívja a m3 módszert. Ismét egy m3 keret jön létre a verem tetején (lásd az alábbi képet).
Tegyük fel, hogy az m3 módszerünk létrehoz egy objektumot a "Számla" osztályhoz, amelynek két int p és int q változója van.
Account {Int p;Int q;}
Itt van a m3 módszer kódja
public void m3(){Account ref = new Account();// more code}
Az új számla () kimutatás egy halom számla objektumot hoz létre.
A "ref" referencia változó egy verem java-ban jön létre.
A operátor hozzárendel egy referencia változót, amely a Halomban lévő objektumra mutat.
Miután a módszer befejezte a végrehajtást. A vezérlés folyamata visszatér a hívási módszerre. Ami ebben az esetben a m2 módszer.
A m3 módszerből származó verem kiürül.
Mivel a referencia változó már nem a halomban lévő objektumra mutat, jogosult lenne a szemétszállításra.
Miután az m2 metódus befejezte a végrehajtását. Kiugrik a veremből, és az összes változója ki lesz mosva, és többé nem lesz használható.
Ugyanígy az m1 módszer esetében is.
Végül a vezérlés folyamata visszatér a program kezdőpontjára. Ami általában a "fő" módszer.
Mi van, ha az Object példányváltozója egy hivatkozás?
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 }
Ebben az esetben a "gyermek" referenciaváltozó halmban jön létre, amely viszont az objektumára mutat, ami hasonló az alább látható diagramhoz.
Összegzés:
- Metódus meghívásakor egy keret jön létre a verem tetején.
- Amint a metódus végrehajtása befejeződött, a vezérlés folyamata visszatér a hívási módszerhez, és a hozzá tartozó veremkeretet kiüríti.
- A veremben helyi változók jönnek létre
- A példányváltozók a kupacban jönnek létre, és azok az objektumok részét képezik, amelyekhez tartoznak.
- A veremben referenciaváltozók jönnek létre.