logo

Stack vs heap Java

I Java, minneshantering är en livsviktig process. Det hanteras automatiskt av Java. JVM delar upp minnet i två delar: stack minne och högminne. Ur Javas perspektiv är båda viktiga minnesområden men båda används för olika ändamål. De stor skillnad mellan stackminne och heapminne är att stacken används för att lagra ordningen för metodexekvering och lokala variabler medan heapminnet lagrar objekten och den använder dynamisk minnesallokering och -deallokering. I det här avsnittet kommer vi att diskutera skillnaderna mellan stack och heap i detalj.

Stack vs heap Java

Stapla minne

Stackminnet är ett fysiskt utrymme (i RAM) som allokeras till varje tråd vid körning. Det skapas när en tråd skapas. Minneshantering i stacken följer LIFO-ordningen (Last-In-First-Out) eftersom den är tillgänglig globalt. Den lagrar variabler, referenser till objekt och delresultat. Minne allokerat till stacklivslängder tills funktionen kommer tillbaka. Om det inte finns något utrymme för att skapa de nya objekten, kastar denjava.lang.StackOverFlowError. Omfattningen av elementen är begränsad till deras trådar. De JVM skapar en separat stack för varje tråd.

Högminne

Den skapas när JVM startar och används av applikationen så länge applikationen körs. Den lagrar objekt och JRE-klasser. Närhelst vi skapar objekt tar det plats i högminnet medan referensen för det objektet skapar i stacken. Den följer inte någon ordning som stacken. Den hanterar minnesblocken dynamiskt. Det betyder att vi inte behöver hantera minnet manuellt. För att hantera minnet automatiskt, Java tillhandahåller sopsamlaren som tar bort de föremål som inte längre används. Minne som allokerats till höglivslängder tills någon händelse, antingen program avslutat eller minnesfritt, inte inträffar. Elementen är globalt tillgängliga i applikationen. Det är ett gemensamt minnesutrymme som delas med alla trådar. Om högen är fullt, kastar denjava.lang.OutOfMemoryError. Högminnet är vidare uppdelat i följande minnesområden:

  • Ung generation
  • Överlevande utrymme
  • Gammal generation
  • Permanent generation
  • Kodcache

Följande bild visar allokeringen av stackminne och heaputrymme.

Stack vs heap Java

Skillnaden mellan Stack och Heap Memory

Följande tabell sammanfattar alla stora skillnader mellan stackminne och heaputrymme.

Parameter Stapla minne Heap Space
Ansökan Den lagrar föremål som har väldigt kort livslängd som t.ex metoder, variabler, och referensvariabler av föremålen. Den lagrar föremål och Java Runtime Environment ( JRE ) klasser.
Beställning Den följer LIFO beställa. Den följer ingen ordning eftersom den är en dynamisk minnesallokering och inte har något fast mönster för allokering och deallokering av minnesblock.
Flexibilitet Det är inte flexibel eftersom vi inte kan ändra det tilldelade minnet. Det är flexibel eftersom vi kan ändra det tilldelade minnet.
Effektivitet Det har snabbare åtkomst, allokering och deallokering. Det har långsammare åtkomst, allokering och deallokering.
Minnesstorlek Det är mindre i storlek. Det är större i storlek.
Java-alternativ som används Vi kan öka stackstorleken genom att använda JVM-alternativet -Xss. Vi kan öka eller minska storleken på heapminnet genom att använda alternativen - Xmx och -Xms JVM.
Synlighet eller omfattning Variablerna är endast synliga för ägartråden. Det är synligt för alla trådar.
Generation av rymd När en tråd skapas, allokerar operativsystemet automatiskt stacken. För att skapa högutrymmet för applikationen anropar språket först operativsystemet vid körning.
Distribution En separat stack skapas för varje objekt. Det delas mellan alla trådar.
Undantagskast JVM kastar java.lang.StackOverFlowError om stackstorleken är större än gränsen. För att undvika detta fel, öka stackstorleken. JVM kastar java.lang.OutOfMemoryError om JVM inte kan skapa en ny inbyggd metod.
Tilldelning/ Deallokering Det görs automatiskt av kompilator . Det görs manuellt av programmerare .
Kosta Dess kostnad är mindre . Dess kostnad är Mer i jämförelse med stack.
Genomförande Dess genomförande är hård . Dess genomförande är lätt .
Ordning för tilldelning Minnestilldelning är kontinuerlig . Minne tilldelat i slumpmässig beställa.
Tråd-säkerhet Det är trådsäkert eftersom varje tråd har sin egen stack. Det är inte trådsäkert, så korrekt synkronisering av koden krävs.