Op Java, geheugen management is een essentieel proces. Het wordt automatisch beheerd door Java. De JVM verdeelt het geheugen in twee delen: stapel geheugen en heapgeheugen. Vanuit het perspectief van Java zijn beide belangrijke geheugengebieden, maar beide worden voor verschillende doeleinden gebruikt. De groot verschil tussen stapelgeheugen en heapgeheugen is dat de stapel wordt gebruikt om de volgorde van uitvoering van de methode en lokale variabelen op te slaan, terwijl het heap-geheugen de objecten opslaat en dynamische geheugentoewijzing en deallocatie gebruikt. In deze sectie zullen we de verschillen tussen stapel en heap in detail bespreken.
Stapel geheugen
Het stapelgeheugen is een fysieke ruimte (in RAM) die tijdens runtime aan elke thread wordt toegewezen. Het wordt gemaakt wanneer er een thread wordt gemaakt. Het geheugenbeheer in de stapel volgt de LIFO-volgorde (Last-In-First-Out), omdat het wereldwijd toegankelijk is. Het slaat de variabelen, verwijzingen naar objecten en gedeeltelijke resultaten op. Geheugen toegewezen om levens te stapelen totdat de functie terugkeert. Als er geen ruimte is voor het maken van de nieuwe objecten, gooit het dejava.lang.StackOverFlowError. De reikwijdte van de elementen is beperkt tot hun threads. De JVM creëert een aparte stapel voor elke draad.
Heap-geheugen
Het wordt gemaakt wanneer de JVM opstart en wordt door de applicatie gebruikt zolang de applicatie actief is. Het slaat objecten en JRE-klassen op. Telkens wanneer we objecten maken, neemt het ruimte in het heap-geheugen in beslag, terwijl de referentie van dat object in de stapel wordt gemaakt. Het volgt geen enkele volgorde zoals de stapel. Het verwerkt de geheugenblokken dynamisch. Het betekent dat we het geheugen niet handmatig hoeven te verwerken. Om het geheugen automatisch te beheren, Java biedt de garbage collector die de objecten verwijdert die niet langer worden gebruikt. Geheugen toegewezen aan heap-levens totdat er geen enkele gebeurtenis plaatsvindt, hetzij programma beëindigd of geheugen vrij. De elementen zijn globaal toegankelijk in de applicatie. Het is een gemeenschappelijke geheugenruimte die wordt gedeeld met alle threads. Als de heapruimte vol is, gooit het dejava.lang.OutOfMemoryError. Het heapgeheugen is verder onderverdeeld in de volgende geheugengebieden:
- Jonge generatie
- Overlevende ruimte
- Oude generatie
- Permanente generatie
- Codecache
De volgende afbeelding toont de toewijzing van stapelgeheugen en heapruimte.
Verschil tussen stapel- en heapgeheugen
De volgende tabel vat alle belangrijke verschillen tussen stapelgeheugen en heapruimte samen.
Parameter | Stapel geheugen | Hoop ruimte |
---|---|---|
Sollicitatie | Het slaat items op die een zeer korte levensduur hebben, zoals methoden, variabelen, En referentievariabelen van de objecten. | Het slaat op voorwerpen en Java Runtime Environment ( JRE ) klassen. |
Bestellen | Het volgt de LIFO volgorde. | Het volgt geen enkele volgorde omdat het een dynamische geheugentoewijzing is en geen vast patroon kent voor de toewijzing en deallocatie van geheugenblokken. |
Flexibiliteit | Het is niet flexibel omdat we het toegewezen geheugen niet kunnen wijzigen. | Het is flexibel omdat we het toegewezen geheugen kunnen wijzigen. |
Efficiëntie | Het heeft sneller toegang, allocatie en deallocatie. | Het heeft langzamer toegang, allocatie en deallocatie. |
Geheugen grootte | Het is kleiner qua maat. | Het is groter qua maat. |
Java-opties gebruikt | We kunnen de stapelgrootte vergroten door de JVM-optie -Xss te gebruiken. | We kunnen de heap-geheugengrootte vergroten of verkleinen door de - Xmx en -Xms JVM-opties te gebruiken. |
Zichtbaarheid of reikwijdte | De variabelen zijn alleen zichtbaar voor de eigenaarthread. | Het is zichtbaar voor alle threads. |
Generatie van ruimte | Wanneer een thread wordt gemaakt, wijst het besturingssysteem de stapel automatisch toe. | Om de heap-ruimte voor de applicatie te creëren, roept de taal eerst het besturingssysteem aan tijdens runtime. |
Verdeling | Voor elk object wordt een aparte stapel gemaakt. | Het wordt gedeeld tussen alle threads. |
Uitzondering gooit | JVM gooit de java.lang.StackOverFlowError als de stapelgrootte groter is dan de limiet. Om deze fout te voorkomen, vergroot u de stapelgrootte. | JVM gooit de java.lang.OutOfMemoryError als de JVM geen nieuwe native methode kan maken. |
Toewijzing/deallocatie | Het wordt automatisch gedaan door de compiler . | Het wordt handmatig gedaan door de programmeur . |
Kosten | De kosten zijn minder . | De kosten zijn meer in vergelijking met stapelen. |
Implementatie | De uitvoering ervan is moeilijk . | De uitvoering ervan is eenvoudig . |
Volgorde van toewijzing | Geheugentoewijzing is continu . | Geheugen toegewezen willekeurig volgorde. |
Draad-veiligheid | Het is thread-safe omdat elke thread zijn eigen stapel heeft. | Het is niet thread-safe, dus een goede synchronisatie van de code is vereist. |