logo

Stack vs Heap Java

U Javi, upravljanje memorijom vitalan je proces. Njime automatski upravlja Java. JVM dijeli memoriju na dva dijela: stog memorija i heap memorija. Iz perspektive Jave, oba su važna memorijska područja, ali se oba koriste u različite svrhe. The glavna razlika između Stack memorije i heap memorije je da se stog koristi za pohranjivanje redoslijeda izvođenja metoda i lokalnih varijabli dok heap memorija pohranjuje objekte i koristi dinamičku dodjelu i oslobađanje memorije. U ovom odjeljku ćemo detaljno raspravljati o razlikama između hrpe i hrpe.

Stack vs Heap Java

Stack Memory

Memorija steka je fizički prostor (u RAM-u) dodijeljen svakoj niti tijekom izvođenja. Nastaje kada se stvori nit. Upravljanje memorijom u stogu slijedi LIFO (Last-In-First-Out) redoslijed jer je dostupno globalno. Pohranjuje varijable, reference na objekte i djelomične rezultate. Memorija dodijeljena snopu života dok se funkcija ne vrati. Ako nema prostora za stvaranje novih objekata, baca sejava.lang.StackOverFlowError. Opseg elemenata ograničen je na njihove niti. The JVM stvara zaseban stog za svaku nit.

Heap memorija

Stvara se kada se JVM pokrene i koristi ga aplikacija sve dok aplikacija radi. Pohranjuje objekte i JRE klase. Kad god stvaramo objekte, oni zauzimaju prostor u memoriji gomile dok se referenca tog objekta stvara u stogu. Ne slijedi nikakav redoslijed kao stog. Dinamički obrađuje memorijske blokove. To znači da ne moramo ručno rukovati memorijom. Za automatsko upravljanje memorijom, Java pruža skupljač smeća koji briše objekte koji se više ne koriste. Memorija dodijeljena gomili živi sve dok se ne dogodi nijedan događaj, bilo da je program prekinut ili da je memorija slobodna. Elementi su globalno dostupni u aplikaciji. To je zajednički memorijski prostor koji se dijeli sa svim nitima. Ako je prostor hrpe pun, baca sejava.lang.OutOfMemoryError. Memorija hrpe dalje je podijeljena na sljedeća memorijska područja:

  • Mlada generacija
  • Prostor za preživjele
  • Stara generacija
  • Stalna generacija
  • Predmemorija koda

Sljedeća slika prikazuje dodjelu memorije steka i prostora gomile.

Stack vs Heap Java

Razlika između memorije hrpe i hrpe

Sljedeća tablica sažima sve glavne razlike između stack memorije i heap prostora.

Parametar Stack Memory Prostor gomile
Primjena Pohranjuje predmete koji imaju vrlo kratak vijek trajanja kao npr metode, varijable, i referentne varijable od objekata. Pohranjuje objekti i Java Runtime Environment ( JRE ) klase.
Naručivanje Slijedi LIFO narudžba. Ne slijedi nikakav redoslijed jer se radi o dinamičkoj dodjeli memorije i nema nikakav fiksni obrazac za dodjelu i poništavanje memorijskih blokova.
Fleksibilnost to je nije fleksibilan jer ne možemo mijenjati dodijeljenu memoriju. to je fleksibilno jer možemo mijenjati dodijeljenu memoriju.
Učinkovitost Ima brže pristup, dodjela i dealokacija. Ima sporije pristup, dodjela i dealokacija.
Veličina memorije to je manji u veličini. to je veći u veličini.
Korištene Java opcije Veličinu stoga možemo povećati korištenjem JVM opcije -Xss. Možemo povećati ili smanjiti veličinu heap memorije korištenjem - Xmx i -Xms JVM opcija.
Vidljivost ili opseg Varijable su vidljive samo vlasniku niti. Vidljivo je svim nitima.
Generacija prostora Kada se stvori nit, operativni sustav automatski dodjeljuje stog. Da bi se stvorio prostor hrpe za aplikaciju, jezik prvo poziva operativni sustav tijekom izvođenja.
Distribucija Za svaki objekt kreira se zaseban stog. Dijeli se među svim nitima.
Bacanja izuzetaka JVM baca java.lang.StackOverFlowError ako je veličina stoga veća od ograničenja. Da biste izbjegli ovu pogrešku, povećajte veličinu stoga. JVM baca java.lang.OutOfMemoryError ako JVM ne može stvoriti novu izvornu metodu.
Dodjela/ Dealokacija To automatski radi sastavljač . To se radi ručno od strane programer .
trošak Njegov trošak je manje . Njegov trošak je više u usporedbi sa stogom.
Provedba Njegova provedba je teško . Njegova provedba je lako .
Redoslijed dodjele Raspodjela memorije je stalan . Memorija dodijeljena u slučajan narudžba.
Sigurnost niti Siguran je za niti jer svaka nit ima svoj vlastiti stog. Nije siguran za niti, pa je potrebna ispravna sinkronizacija koda.