logo

Stack vs Heap Java

v Javě, správa paměti je životně důležitý proces. Je spravován Java automaticky. JVM rozděluje paměť na dvě části: zásobník paměť a hromada paměti. Z pohledu Javy jsou obě důležité oblasti paměti, ale obě se používají pro různé účely. The hlavní rozdíl mezi pamětí zásobníku a pamětí haldy spočívá v tom, že zásobník se používá k uložení pořadí provádění metody a lokálních proměnných, zatímco paměť haldy ukládá objekty a používá dynamickou alokaci a dealokaci paměti. V této části podrobně probereme rozdíly mezi zásobníkem a haldou.

Stack vs Heap Java

Zásobník paměti

Paměť zásobníku je fyzický prostor (v RAM) přidělený každému vláknu za běhu. Je vytvořen, když se vytvoří vlákno. Správa paměti v zásobníku se řídí pořadím LIFO (Last-In-First-Out), protože je přístupná globálně. Ukládá proměnné, odkazy na objekty a dílčí výsledky. Paměť přidělená zásobníku žije, dokud se funkce nevrátí. Pokud není prostor pro vytvoření nových objektů, vyhodíjava.lang.StackOverFlowError. Rozsah prvků je omezen na jejich vlákna. The JVM vytvoří samostatný zásobník pro každé vlákno.

Paměť haldy

Je vytvořen při spuštění JVM a používán aplikací tak dlouho, dokud aplikace běží. Ukládá objekty a třídy JRE. Kdykoli vytváříme objekty, zabírá místo v paměti haldy, zatímco reference na tento objekt se vytváří v zásobníku. Nesleduje žádné pořadí jako zásobník. Dynamicky zpracovává paměťové bloky. To znamená, že s pamětí nemusíme manipulovat ručně. Pro automatickou správu paměti, Jáva poskytuje garbage collector, který odstraňuje objekty, které se již nepoužívají. Paměť přidělená haldě žije, dokud nedojde k jakékoli události, ukončení programu nebo volné paměti. Prvky jsou v aplikaci globálně přístupné. Je to společný paměťový prostor sdílený se všemi vlákny. Pokud je prostor haldy plný, vyhodíjava.lang.OutOfMemoryError. Paměť haldy je dále rozdělena do následujících paměťových oblastí:

  • Mladá generace
  • Prostor přeživších
  • Stará generace
  • Stálá generace
  • Mezipaměť kódu

Následující obrázek ukazuje přidělení paměti zásobníku a prostoru haldy.

Stack vs Heap Java

Rozdíl mezi zásobníkovou a haldou paměti

Následující tabulka shrnuje všechny hlavní rozdíly mezi pamětí zásobníku a prostorem haldy.

Parametr Zásobník paměti Prostor haldy
aplikace Skladuje předměty, které mají velmi krátkou životnost jako např metody, proměnné, a referenční proměnné objektů. Ukládá se objektů a Java Runtime Environment ( JRE ) třídy.
Objednávání Z toho vyplývá LIFO objednat. Nenásleduje žádné pořadí, protože se jedná o dynamickou alokaci paměti a nemá žádný pevný vzor pro alokaci a dealokaci paměťových bloků.
Flexibilita to je není flexibilní protože nemůžeme změnit přidělenou paměť. to je flexibilní protože můžeme změnit přidělenou paměť.
Účinnost Má to rychlejší přístup, alokace a dealokace. Má to pomalejší přístup, alokace a dealokace.
Velikost paměti to je menší ve velikosti. to je větší ve velikosti.
Použité možnosti Java Velikost zásobníku můžeme zvětšit pomocí volby JVM -Xss. Velikost paměti haldy můžeme zvětšit nebo zmenšit pomocí voleb - Xmx a -Xms JVM.
Viditelnost nebo Rozsah Proměnné jsou viditelné pouze pro vlákno vlastníka. Je viditelný pro všechna vlákna.
Generace vesmíru Po vytvoření vlákna operační systém automaticky přidělí zásobník. K vytvoření prostoru haldy pro aplikaci jazyk nejprve zavolá operační systém za běhu.
Rozdělení Pro každý objekt je vytvořen samostatný zásobník. Je sdílen mezi všemi vlákny.
Výjimečné hody JVM hodí java.lang.StackOverFlowError pokud je velikost zásobníku větší než limit. Chcete-li se této chybě vyhnout, zvyšte velikost zásobníku. JVM hodí java.lang.OutOfMemoryError pokud JVM nedokáže vytvořit novou nativní metodu.
Přidělování/přidělování To se provádí automaticky pomocí kompilátor . Provádí se ručně pomocí programátor .
Náklady Jeho cena je méně . Jeho cena je více v porovnání se zásobníkem.
Implementace Jeho implementace je tvrdý . Jeho implementace je snadný .
Pořadí přidělení Alokace paměti je kontinuální . Paměť alokovaná v náhodný objednat.
Závitová bezpečnost Je bezpečný pro vlákna, protože každé vlákno má svůj vlastní zásobník. Není bezpečný pro vlákna, takže je vyžadována správná synchronizace kódu.