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.
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.
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. |