Java nyelven, memóriakezelés létfontosságú folyamat. A Java automatikusan kezeli. A JVM két részre osztja a memóriát: Kazal memória és kupac memória. A Java szempontjából mindkettő fontos memóriaterület, de mindkettőt különböző célokra használják. A fő különbség a verem memória és a kupac memória között az, hogy a verem a metódusok végrehajtásának sorrendjét és a helyi változókat tárolja, míg a kupacmemória tárolja az objektumokat, és dinamikus memóriafoglalást és felszabadítást használ. Ebben a részben részletesen tárgyaljuk a verem és a kupac közötti különbségeket.
Stack memória
A veremmemória egy fizikai hely (a RAM-ban), amely futási időben minden szálhoz van lefoglalva. Akkor jön létre, amikor létrejön egy szál. A veremben a memóriakezelés LIFO (Last-In-First-Out) sorrendet követ, mivel globálisan elérhető. Tárolja a változókat, az objektumokra való hivatkozásokat és a részeredményeket. Memória lefoglalva a verem élettartamához, amíg a függvény vissza nem tér. Ha nincs hely az új objektumok létrehozására, akkor kidobja ajava.lang.StackOverFlowError. Az elemek hatóköre a szálaikra korlátozódik. A JVM minden szálhoz külön köteget hoz létre.
Halom memória
Akkor jön létre, amikor a JVM elindul, és az alkalmazás használja mindaddig, amíg az alkalmazás fut. Tárolja az objektumokat és a JRE osztályokat. Amikor objektumokat hozunk létre, az a kupacmemóriában foglal helyet, míg az objektum hivatkozása létrejön a veremben. Nem követ semmilyen sorrendet, mint a verem. Dinamikusan kezeli a memóriablokkokat. Ez azt jelenti, hogy nem kell manuálisan kezelnünk a memóriát. A memória automatikus kezeléséhez, Jáva biztosítja a szemétgyűjtőt, amely törli a már nem használt objektumokat. A halomhoz lefoglalt memória mindaddig él, amíg egyetlen esemény, akár a program le nem fejeződik, akár a memória felszabadulása meg nem történik. Az elemek globálisan elérhetők az alkalmazásban. Ez egy közös memóriaterület, amelyet az összes szál megoszt. Ha a kupac hely megtelik, dobja ajava.lang.OutOfMemoryError. A kupacmemória a következő memóriaterületekre oszlik:
- Fiatal generáció
- Túlélő tér
- Régi generáció
- Állandó generáció
- Kód gyorsítótár
A következő kép a veremmemória és a kupacterület lefoglalását mutatja.
Különbség a verem és a kupac memória között
A következő táblázat összefoglalja a veremmemória és a kupacterület közötti összes főbb különbséget.
Paraméter | Stack memória | Heap Space |
---|---|---|
Alkalmazás | Olyan tárgyakat tárol, amelyek nagyon rövid élettartamúak, mint pl módszerek, változók, és referencia változók a tárgyak közül. | Ez tárolja tárgyakat és Java Runtime Environment ( JRE ) osztályok. |
Rendelés | Ebből következik a LIFO rendelés. | Nem követ semmilyen sorrendet, mert ez egy dinamikus memóriafoglalás, és nincs rögzített mintája a memóriablokkok lefoglalására és felszabadítására. |
Rugalmasság | Ez nem rugalmas mert nem tudjuk megváltoztatni a lefoglalt memóriát. | Ez rugalmas mert megváltoztathatjuk a lefoglalt memóriát. |
Hatékonyság | Megvan gyorsabban hozzáférés, allokáció és felosztás. | Megvan lassabb hozzáférés, allokáció és felosztás. |
Memória méret | Ez kisebb méretben. | Ez nagyobb méretben. |
Használt Java opciók | A verem méretét a JVM -Xss opció használatával növelhetjük. | A kupac memória méretét növelhetjük vagy csökkenthetjük az - Xmx és -Xms JVM opciók használatával. |
Láthatóság vagy hatókör | A változókat csak a tulajdonosi szál láthatja. | Minden szál számára látható. |
A tér generációja | A szál létrehozásakor az operációs rendszer automatikusan lefoglalja a veremet. | Az alkalmazás kupacterületének létrehozásához a nyelv először futás közben hívja meg az operációs rendszert. |
terjesztés | Minden objektumhoz külön verem jön létre. | Meg van osztva az összes szál között. |
Kivétel dobások | JVM dobja a java.lang.StackOverFlowError ha a verem mérete nagyobb a határértéknél. A hiba elkerülése érdekében növelje meg a verem méretét. | JVM dobja a java.lang.OutOfMemoryError ha a JVM nem tud új natív metódust létrehozni. |
Allokáció/felosztás | Ezt automatikusan a fordítóprogram . | Ezt manuálisan végzi a programozó . |
Költség | A költsége az Kevésbé . | A költsége az több veremhez képest. |
Végrehajtás | Megvalósítása az kemény . | Megvalósítása az könnyen . |
Az elosztás sorrendje | A memóriafoglalás az folyamatos . | Memória lefoglalva véletlen rendelés. |
Menetbiztonság | Szálbiztos, mert minden szálnak megvan a maga verem. | Nem szálbiztos, ezért a kód megfelelő szinkronizálása szükséges. |