Co je přidělení paměti v Javě? Stack and Heap Memory



Tento článek založený na „Alokaci paměti v Javě“ vám pomůže s podrobnými znalostmi o alokaci paměti spolu s datovými strukturami Stack a Heap.

Přidělení paměti je proces, kterým jsou počítačové programy a služby přiřazovány fyzickým nebo virtuálním Paměť prostor. V tomto článku se dozvíme o alokaci paměti v a probereme Stack and Heap Memory.

Co je to Stack Memory?

K provedení vlákna se používá paměť Java Stack. Obsahují hodnoty specifické pro metodu, které jsou krátkodobé, a odkazy na další objekty v haldě, která je získávána z metody.





Zásobník paměť je vždy odkazována v LIFO (Last-In-First-Out) objednat. Kdykoli je vyvolána metoda, vytvoří se v paměti zásobníku nový blok pro metodu, která bude obsahovat místní primitivní hodnoty a odkaz na jiné objekty v metodě.

Jakmile metoda skončí, blok přestane být používán a bude k dispozici pro další metodu.



Ve srovnání s hromadou paměti je velikost paměti zásobníku mnohem menší.

co se serializuje v Javě

Klíčové vlastnosti paměti zásobníku

Kromě toho, o čem jsme doposud diskutovali, následují některé další vlastnosti Zásobník Paměť:

  • Roste a zmenšuje se, jak se volají a vracejí nové metody
  • Proměnné uvnitř zásobníku existují, pouze pokud běží metoda, která je vytvořila
  • Své automaticky přidělené a uvolněné, když metoda dokončí provádění
  • Pokud je tato paměť plná, hodí se Java java.lang.StackOverFlowError
  • Přístup do této paměti je rychle ve srovnání s haldy paměti
  • Tato paměť je bezpečné pro vlákna protože každé vlákno pracuje ve svém vlastním zásobníku

Metody ve třídě Stack

  • Zatlačení objektu ( Prvek objektu ): Zatlačí prvek na horní část zásobníku.
  • Pop objektu (): Odebere a vrátí horní prvek zásobníku. An „EmptyStackException“ výjimka je vyvolána, pokud voláme pop (), když je vyvolávací zásobník prázdný.
  • Prohlížení objektu (): Vrátí prvek v horní části zásobníku, ale neodstraní ho.
  • Boolean prázdný (): Vrátí true, pokud v horní části zásobníku není nic. Jinak vrátí false.
  • int vyhledávání ( Prvek objektu ): Určuje, zda objekt existuje v zásobníku. Pokud je prvek nalezen, vrátí jeho polohu z horní části zásobníku. Jinak vrátí -1.

Java kód pro implementaci zásobníku

import java.io. * import java.util. * třída Test {static void stack_push (stack stack) {for (int i = 0 i<5 i++){ stack.push(i) } } static void stack_pop(Stack stack){ System.out.println('Pop :') for(int i = 0 i < 5 i++){ Integer y = (Integer) stack.pop() System.out.println(y) } } static void stack_peek(Stack stack){ Integer element = (Integer) stack.peek() System.out.println('Element on stack top : ' + element) } static void stack_search(Stack stack, int element){ Integer pos = (Integer) stack.search(element) if(pos == -1) System.out.println('Element not found') else System.out.println('Element is found at position ' + pos) } public static void main (String[] args){ Stack stack = new Stack() stack_push(stack) stack_pop(stack) stack_push(stack) stack_peek(stack) stack_search(stack, 2) stack_search(stack, 6) } } 

//Výstup



memory-allocation-in-java

Nyní se přesuňme do haldy.

Haldy prostor v Javě

Paměť je přidělena během provádění pokynů napsaných programátory. Všimněte si, že halda názvu nemá nic společného s datovou strukturou haldy. Nazývá se halda, protože je to hromada paměťového prostoru, který mají programátoři k dispozici přiděleno a zrušit přidělení. Pokud programátor tuto paměť nezpracovává dobře, může dojít k úniku pamětistane se v programu.

Klíčové vlastnosti paměti Java Heap

  • Kromě toho, o čem jsme doposud diskutovali, následují některé další funkce haldy:
  • Je přístupný prostřednictvím komplexních technik správy paměti, které zahrnují Mladá generace, stará nebo Generovaná osoba, a Stálá generace
  • Pokud je halda plná, hodí se Java java.lang.OutOfMemoryError
  • Přístup k této paměti je relativně pomalejší než paměť zásobníku
  • Na rozdíl od zásobníku není tato paměť automaticky uvolněna. Potřebuje to Popelář uvolnit nepoužívané objekty tak, aby byla zachována efektivita využití paměti
  • Na rozdíl od hromady hromada není bezpečné pro vlákna a je třeba jej chránit správnou synchronizací kódu

Rozdíl mezi Java Heap Space a Stack Memory

Na základě výše uvedených vysvětlení můžeme snadno uzavřít následující rozdíly Halda a Zásobník Paměť.

__init__ python
  • Halda paměť je využívána všemi částmi aplikace, zatímco paměť zásobníku je využívána pouze jedním podprocesem provádění.
  • Kdykoli je objekt vytvořen, je vždy uložen v prostoru haldy a paměť zásobníku obsahuje odkaz na něj. Paměť zásobníku obsahuje pouze lokální primitivní proměnné a referenční proměnné k objektům v haldě.
  • Objekty uložené v haldě jsou globálně přístupné, zatímco do paměti zásobníku nelze získat přístup jinými vlákny.
  • Správa paměti v zásobníku se provádí v a LIFO způsobem, zatímco v haldě je složitější, protože se používá globálně. Halda paměti je rozdělena na Mladá generace, stará generace atd., více podrobností na Java Garbage Collection.
  • Paměť zásobníku je krátkodobý vzhledem k tomu, že paměť haldy žije od začátku do konce spuštění aplikace.
  • Můžeme použít -XMX a -XMS Možnost JVM k určení spouštěcí velikosti a maximální velikosti haldy paměti. Můžeme použít -XSS definovat velikost paměti zásobníku.
  • Když je paměť zásobníku plná, hodí se runtime Java java.lang.StackOverFlowError vzhledem k tomu, že pokud je halda plná, hodí se java.lang.OutOfMemoryError: Halda prostoru Javachyba.
  • Velikost vyrovnávací paměti je ve srovnání s haldy mnohem menší. Z důvodu jednoduchosti alokace paměti (LIFO), paměť zásobníku je ve srovnání shalda paměti.

Srovnávací graf

PARAMETR ZÁSOBNÍK HALDA
Základní Paměť je přidělena v souvislém blokuPaměť je alokována v náhodném pořadí
Přidělování a přidělování Automaticky kompilátoremRuční programátor
Náklady MéněVíce
Implementace TvrdýSnadný
Čas přístupu RychlejšíPomaleji
Hlavní problém Nedostatek pamětiFragmentace paměti
Lokalita rozdílu VynikajícíAdekvátní
Flexibilita Pevná sazbaZměna velikosti je možná

S tímto se dostáváme na konec tohoto výukového programu „Přidělení paměti v Javě“. Doufám, že jste pochopili koncept a jeho implementaci na několika příkladech v reálném čase.

Nyní, když jste to pochopiliPřidělení paměti v Javězáklady tohoto článku „Přidělení paměti v Javě“, podívejte se na Edureka, důvěryhodná online vzdělávací společnost se sítí více než 250 000 spokojených studentů rozložených po celém světě. Výukové a certifikační kurzy Edureka Java J2EE a SOA jsou určeny pro studenty a profesionály, kteří chtějí být vývojářem Java. Kurz je navržen tak, aby vám poskytl náskok v programování v Javě a naučil vás základní i pokročilé koncepty Javy spolu s různými rámci Java, jako je Hibernate & Jaro .

Máte na nás dotaz? Uveďte to v sekci komentářů v tomto blogu „Přidělení paměti v Javě“ a my se vám ozveme co nejdříve.