logo

Stack vs Heap Java

v Jave správa pamäte je životne dôležitý proces. Spravuje ho Java automaticky. JVM rozdeľuje pamäť na dve časti: stoh pamäť a haldová pamäť. Z pohľadu Java sú obe dôležité pamäťové oblasti, ale obe sa používajú na rôzne účely. The hlavný rozdiel medzi zásobníkovou pamäťou a haldovou pamäťou spočíva v tom, že zásobník sa používa na ukladanie poradia vykonávania metódy a lokálnych premenných, zatiaľ čo pamäť haldy ukladá objekty a používa dynamickú alokáciu pamäte a rozmiestnenie. V tejto časti podrobne rozoberieme rozdiely medzi zásobníkom a haldou.

Stack vs Heap Java

Zásobník pamäte

Pamäť zásobníka je fyzický priestor (v RAM) pridelený každému vláknu v čase spustenia. Vytvára sa, keď sa vytvára vlákno. Správa pamäte v zásobníku sa riadi poradím LIFO (Last-In-First-Out), pretože je prístupná globálne. Ukladá premenné, odkazy na objekty a čiastkové výsledky. Pamäť alokovaná na zásobník žije, kým sa funkcia nevráti. Ak nie je priestor na vytváranie nových objektov, hodí sajava.lang.StackOverFlowError. Rozsah prvkov je obmedzený na ich vlákna. The JVM vytvorí samostatný zásobník pre každé vlákno.

Pamäť haldy

Vytvára sa pri spustení JVM a používa ho aplikácia, kým je spustená. Ukladá objekty a triedy JRE. Kedykoľvek vytvárame objekty, zaberá priestor v pamäti haldy, zatiaľ čo referencia tohto objektu sa vytvára v zásobníku. Nesleduje žiadne poradie ako zásobník. Dynamicky spracováva pamäťové bloky. To znamená, že s pamäťou nemusíme manipulovať manuálne. Pre automatickú správu pamäte, Java poskytuje zberač odpadu, ktorý odstraňuje objekty, ktoré sa už nepoužívajú. Pamäť pridelená halde žije dovtedy, kým nenastane žiadna udalosť, ukončenie programu alebo uvoľnenie pamäte. Prvky sú v aplikácii globálne prístupné. Je to spoločný pamäťový priestor zdieľaný so všetkými vláknami. Ak je priestor haldy plný, hodí sajava.lang.OutOfMemoryError. Pamäť haldy je ďalej rozdelená do nasledujúcich pamäťových oblastí:

  • Mladá generácia
  • Priestor prežitia
  • Stará generácia
  • Stála generácia
  • Vyrovnávacia pamäť kódu

Nasledujúci obrázok zobrazuje pridelenie pamäte zásobníka a priestoru haldy.

Stack vs Heap Java

Rozdiel medzi zásobníkovou a haldou pamäťou

Nasledujúca tabuľka sumarizuje všetky hlavné rozdiely medzi pamäťou zásobníka a priestorom haldy.

Parameter Zásobník pamäte Priestor haldy
Aplikácia Skladuje predmety, ktoré majú veľmi krátku životnosť ako napr metódy, premenné, a referenčné premenné objektov. Ukladá predmety a Java Runtime Environment ( JRE ) triedy.
Objednávanie Z toho vyplýva LIFO objednať. Nesleduje žiadne poradie, pretože ide o dynamickú alokáciu pamäte a nemá žiadny pevný vzor na prideľovanie a uvoľňovanie pamäťových blokov.
Flexibilita to je nie flexibilné pretože nemôžeme zmeniť pridelenú pamäť. to je flexibilný pretože môžeme zmeniť pridelenú pamäť.
Efektívnosť rýchlejšie prístup, prideľovanie a rozdeľovanie. pomalšie prístup, prideľovanie a rozdeľovanie.
Veľkosť pamäte to je menšie vo veľkosti. to je väčší vo veľkosti.
Použité možnosti Java Veľkosť zásobníka môžeme zväčšiť použitím možnosti JVM -Xss. Veľkosť pamäte haldy môžeme zväčšiť alebo zmenšiť pomocou možností - Xmx a -Xms JVM.
Viditeľnosť alebo Rozsah Premenné sú viditeľné iba pre vlákno vlastníka. Je viditeľný pre všetky vlákna.
Generácia vesmíru Keď sa vytvorí vlákno, operačný systém automaticky pridelí zásobník. Aby sa vytvoril priestor haldy pre aplikáciu, jazyk najskôr zavolá operačný systém v čase spustenia.
Distribúcia Pre každý objekt je vytvorený samostatný zásobník. Je zdieľaný medzi všetkými vláknami.
Výnimka hodí JVM hodí java.lang.StackOverFlowError ak je veľkosť zásobníka väčšia ako limit. Ak sa chcete tejto chybe vyhnúť, zväčšite veľkosť zásobníka. JVM hodí java.lang.OutOfMemoryError ak JVM nedokáže vytvoriť novú natívnu metódu.
Pridelenie/pridelenie Vykonáva to automaticky kompilátor . Vykonáva sa ručne pomocou programátor .
náklady Jeho cena je menej . Jeho cena je viac v porovnaní so zásobníkom.
Implementácia Jeho realizácia je ťažké . Jeho realizácia je ľahké .
Poradie prideľovania Pridelenie pamäte je nepretržitý . Pamäť pridelená v náhodný objednať.
Závitová bezpečnosť Je bezpečný pre vlákna, pretože každé vlákno má svoj vlastný zásobník. Nie je bezpečný pre vlákna, takže je potrebná správna synchronizácia kódu.