logo

Stack vs Heap Java

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 vs Heap Java

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.

Stack vs Heap Java

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.