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