Wat is geheugentoewijzing in Java? Stapel en hoop geheugen



Dit artikel gebaseerd op 'Geheugentoewijzing in Java' zal u helpen met een gedetailleerde kennis over geheugentoewijzing samen met Stack en Heap datastructuren.

Geheugentoewijzing is een proces waarbij computerprogramma's en -services fysiek of virtueel worden toegewezen geheugen ruimte. In dit artikel zullen we leren over geheugentoewijzing in en we zullen Stack en Heap Memory bespreken.

Wat is stapelgeheugen?

Java Stack-geheugen wordt gebruikt voor het uitvoeren van een thread. Ze bevatten methodespecifieke waarden die van korte duur zijn en verwijzingen naar andere objecten in de heap waarnaar wordt verwezen door de methode.





Stapel geheugen wordt altijd verwezen in LIFO (Last-In-First-Out) bestellen. Telkens wanneer een methode wordt aangeroepen, wordt een nieuw blok gemaakt in het stapelgeheugen voor de methode om lokale primitieve waarden en verwijzing naar andere objecten in de methode te bevatten.

Zodra de methode eindigt, wordt het blok ongebruikt en komt het beschikbaar voor de volgende methode.



hoe een programma in java te beëindigen

De grootte van het stapelgeheugen is veel kleiner in vergelijking met het Heap-geheugen.

Belangrijkste kenmerken van Stack Memory

Afgezien van wat we tot nu toe hebben besproken, volgen hier enkele andere kenmerken van Stapel geheugen:

  • Het groeit en krimpt naarmate nieuwe methoden respectievelijk worden aangeroepen en geretourneerd
  • Variabelen in de stapel bestaan ​​alleen zolang de methode waarmee ze zijn gemaakt, actief is
  • Haar automatisch toegewezen en ongedaan gemaakt wanneer de methode de uitvoering voltooit
  • Als dit geheugen vol is, gooit Java java.lang.StackOverFlowError
  • Toegang tot dit geheugen is snel in vergelijking met heap-geheugen
  • Deze herinnering is draad-veilig aangezien elke thread in zijn eigen stapel werkt

Methoden in Stack-klasse

  • Object push ( Object-element ): Duwt een element bovenop de stapel.
  • Object pop (): Verwijdert het bovenste element van de stapel en geeft het terug. Een ‘EmptyStackException’ uitzondering wordt gegenereerd als we pop () aanroepen wanneer de aanroepende stapel leeg is.
  • Object peek (): Retourneert het element bovenop de stapel, maar verwijdert het niet.
  • Booleaanse leeg (): Het geeft true terug als er niets bovenaan de stapel staat. Anders retourneert false.
  • int zoeken ( Object-element ): Het bepaalt of er een object in de stapel bestaat. Als het element wordt gevonden, geeft het de positie van het element terug vanaf de bovenkant van de stapel. Anders retourneert het -1.

Java-code voor stackimplementatie

import java.io. * import java.util. * class Test {static void stack_push (Stack stack) {voor (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) } } 

// Uitvoer



memory-allocation-in-java

Laten we nu naar Heap Space gaan.

Heap Space in Java

Het geheugen wordt toegewezen tijdens de uitvoering van instructies geschreven door programmeurs. Merk op dat de naamheap niets te maken heeft met de datastructuur van de heap. Het wordt heap genoemd omdat het een stapel geheugenruimte is die beschikbaar is voor programmeurs toegewezen en ongedaan maken. Als een programmeur dit geheugen niet goed kan verwerken, kan een geheugenlek ontstaangebeuren in het programma.

Belangrijkste kenmerken van Java Heap Memory

  • Afgezien van wat we tot nu toe hebben besproken, volgen hier enkele andere kenmerken van heapspace:
  • Het is toegankelijk via complexe geheugenbeheertechnieken, waaronder Jonge generatie, oud of Vaste generatie, en Permanente generatie
  • Als de heapruimte vol is, gooit Java java.lang.OutOfMemoryError
  • Toegang tot dit geheugen is relatief langzamer dan stapelgeheugen
  • Dit geheugen wordt, in tegenstelling tot stack, niet automatisch ongedaan gemaakt. Het heeft nodig Vuilnisman om ongebruikte objecten vrij te maken om de efficiëntie van het geheugengebruik te behouden
  • In tegenstelling tot stack is een hoop dat niet draad-veilig en moet worden bewaakt door de code correct te synchroniseren

Verschil tussen Java Heap Space en Stack Memory

Op basis van bovenstaande uitleg kunnen we gemakkelijk de volgende verschillen concluderen tussen Hoop en Stapel geheugen.

  • Hoop geheugen wordt gebruikt door alle delen van de applicatie, terwijl stapelgeheugen alleen wordt gebruikt door één thread van uitvoering.
  • Elke keer dat een object wordt gemaakt, wordt het altijd opgeslagen in de Heap-ruimte en bevat het stapelgeheugen de verwijzing ernaar. Het stapelgeheugen bevat alleen lokale primitieve variabelen en referentievariabelen naar objecten in heapruimte.
  • Objecten die in de heap zijn opgeslagen, zijn wereldwijd toegankelijk, terwijl het stapelgeheugen niet toegankelijk is voor andere threads.
  • Geheugenbeheer in de stapel gebeurt in een LIFO manier, terwijl het complexer is in het Heap-geheugen omdat het wereldwijd wordt gebruikt. Heap-geheugen is onderverdeeld in Jonge generatie, oude generatie etc, meer details op Java Garbage Collection.
  • Stack-geheugen is van korte duur terwijl heap-geheugen leeft van het begin tot het einde van de uitvoering van het programma.
  • We kunnen gebruiken -XMX en -XMS JVM-optie om de opstartgrootte en maximale grootte van heap-geheugen te definiëren. We kunnen gebruiken -XSS om de grootte van het stapelgeheugen te definiëren.
  • Als het stapelgeheugen vol is, gooit Java-runtime java.lang.StackOverFlowError terwijl als het geheugen vol is, het gooit java.lang.OutOfMemoryError: Java Heap Spacefout.
  • De grootte van het stapelgeheugen is veel kleiner in vergelijking met het Heap-geheugen. Vanwege eenvoud in geheugentoewijzing (LIFO), stapelgeheugen is erg snel in vergelijking methoop geheugen.

Vergelijkingstabel

PARAMETER STAPEL HOOP
Basic Geheugen wordt toegewezen in een aaneengesloten blokHet geheugen wordt in willekeurige volgorde toegewezen
Toewijzing en vrijgave Automatisch door compilerHandleiding door programmeur
Kosten MinderMeer
Implementatie MoeilijkGemakkelijk
Toegangstijd SnellerLangzamer
Hoofdzaak Gebrek aan geheugenGeheugenfragmentatie
Plaats van verschil UitstekendVoldoende
Flexibiliteit Vaste renteFormaat wijzigen is mogelijk

Hiermee komen we aan het einde van deze 'Memory Allocation in Java' Tutorial. Ik hoop dat je het concept en de implementatie ervan aan de hand van enkele real-time voorbeelden hebt begrepen.

Nu je het hebt begrepenGeheugentoewijzing in Javabasisbeginselen via dit 'Geheugentoewijzing in Java' -artikel bekijk het door Edureka, een vertrouwd online leerbedrijf met een netwerk van meer dan 250.000 tevreden leerlingen verspreid over de hele wereld. Edureka's Java J2EE- en SOA-trainings- en certificeringscursussen zijn bedoeld voor studenten en professionals die Java-ontwikkelaar willen worden. De cursus is ontworpen om u een voorsprong te geven in het programmeren van Java en u te trainen in zowel kern- als geavanceerde Java-concepten, samen met verschillende Java-frameworks zoals Hibernate & De lente .

Heeft u een vraag voor ons? Vermeld het in het commentaargedeelte van deze 'Geheugentoewijzing in Java' -blog en we nemen zo snel mogelijk contact met u op.