Stakk minne og masse plass i Java

1. Introduksjon

For å kjøre et program på en optimal måte, deler JVM minne i stack og heap minne. Når vi deklarerer nye variabler og objekter, ring ny metode, erklær a String eller utføre lignende operasjoner, utpeker JVM minne til disse operasjonene fra enten Stack Memory eller Heap Space.

I denne opplæringen vil vi diskutere disse minnemodellene. Vi vil verve noen viktige forskjeller mellom dem, hvordan de lagres i RAM, funksjonene de tilbyr og hvor de skal brukes.

2. Stakk minne i Java

Stack Memory i Java brukes til statisk minnetildeling og utføring av en tråd. Den inneholder primitive verdier som er spesifikke for en metode og referanser til objekter som er i en haug, referert fra metoden.

Tilgang til dette minnet er i Last-In-First-Out (LIFO) rekkefølge. Hver gang en ny metode kalles, opprettes en ny blokk på toppen av stabelen som inneholder verdier som er spesifikke for den metoden, som primitive variabler og referanser til objekter.

Når metoden er ferdig med utførelsen, skylles den tilsvarende stabelrammen, strømmen går tilbake til anropsmetoden, og plass blir tilgjengelig for neste metode.

2.1. Nøkkelfunksjoner i Stack Memory

Bortsett fra det vi har diskutert så langt, er det noen andre funksjoner i stackminne:

  • Den vokser og krymper når nye metoder kalles og returneres henholdsvis
  • Variabler i stabelen eksisterer bare så lenge metoden som opprettet dem kjører
  • Den tildeles automatisk og fordeles når metoden er ferdig med utførelsen
  • Hvis dette minnet er fullt, kaster Java java.lang.StackOverFlowError
  • Tilgang til dette minnet er raskt sammenlignet med masseminne
  • Dette minnet er trådsikkert ettersom hver tråd fungerer i sin egen bunke

3. Heap Space i Java

Heap space i Java brukes til dynamisk minnetildeling for Java-objekter og JRE-klasser under kjøretiden. Nye objekter blir alltid opprettet i massevis, og referansene til disse objektene lagres i stackminnet.

Disse objektene har global tilgang og kan nås fra hvor som helst i applikasjonen.

Denne minnemodellen er videre delt inn i mindre deler som kalles generasjoner, disse er:

  1. Ung generasjon - det er her alle nye objekter tildeles og eldes. En mindre søppeloppsamling oppstår når denne fylles opp
  2. Gammel eller fast generasjon - det er her gjenværende gjenstander er lagret. Når objekter lagres i Young Generation, settes en terskel for objektets alder, og når denne terskelen er nådd, flyttes objektet til den gamle generasjonen
  3. Permanent generasjon - denne består av JVM-metadata for kjøretidsklasser og applikasjonsmetoder

Disse forskjellige delene er også diskutert i denne artikkelen - Forskjellen mellom JVM, JRE og JDK.

Vi kan alltid manipulere størrelsen på heapminne i henhold til vårt krav. For mer informasjon, besøk denne koblede Baeldung-artikkelen.

3.1. Viktige funksjoner i Java Heap Memory

Bortsett fra det vi har diskutert så langt, er det noen andre funksjoner i haugplass:

  • Den er tilgjengelig via komplekse minnestyringsteknikker som inkluderer Young Generation, Old eller Tenured Generation og Permanent Generation
  • Hvis haugplassen er full, kaster Java java.lang.OutOfMemoryError
  • Tilgangen til dette minnet er relativt tregere enn stakkminnet
  • Dette minnet, i motsetning til stabelen, blir ikke automatisk distribuert. Det trenger Garbage Collector for å frigjøre ubrukte gjenstander for å holde effektiviteten i minnebruk
  • I motsetning til stack, er en haug ikke trådsikker og må beskyttes ved å synkronisere koden riktig

4. Eksempel

Basert på det vi har lært så langt, la oss analysere en enkel Java-kode og la oss vurdere hvordan minne administreres her:

klasse Person {int id; Strengnavn; offentlig person (int id, strengnavn) {this.id = id; this.name = navn; }} offentlig klasse PersonBuilder {privat statisk person buildPerson (int id, strengnavn) {returner ny person (id, navn); } public static void main (String [] args) {int id = 23; Strengnavn = "John"; Person person = null; person = buildPerson (id, navn); }}

La oss analysere dette trinnvis:

  1. Ved innreise til hoved() metode, vil det opprettes et rom i stabelminnet for å lagre primitiver og referanser for denne metoden
    • Den primitive verdien av heltall id lagres direkte i stabelminnet
    • Referansevariabelen person av typen Person vil også bli opprettet i stabelminnet som peker på det faktiske objektet i dyngen
  2. Anropet til den parameteriserte konstruktøren Person (int, String) fra hoved() vil tildele ytterligere minne på toppen av forrige bunke. Dette lagrer:
    • De dette objektreferanse til det anropende objektet i stackminnet
    • Den primitive verdien id i stabelminnet
    • Referansevariabelen til String argument Navn som vil peke på den faktiske strengen fra strengbassenget i heapminne
  3. De hoved- metoden er videre kalle buildPerson () statisk metode, for hvilken videre tildeling vil finne sted i stackminne på toppen av den forrige. Dette vil igjen lagre variabler på den måten som er beskrevet ovenfor.
  4. Imidlertid for det nyopprettede objektet person av typen Personvil alle forekomstvariabler bli lagret i heapminne.

Denne tildelingen er forklart i dette diagrammet:

5. Sammendrag

Før vi avslutter denne artikkelen, la oss raskt oppsummere forskjellene mellom Stack Memory og Heap Space:

ParameterStakk minneHeap Space
applikasjonStack brukes i deler, en om gangen under utførelse av en trådHele applikasjonen bruker masse plass i løpetid
StørrelseStack har størrelsesbegrensninger avhengig av operativsystem og er vanligvis mindre enn HeapDet er ingen størrelsesbegrensning på Heap
OppbevaringLagrer bare primitive variabler og referanser til objekter som er opprettet i Heap SpaceAlle de nyopprettede objektene lagres her
RekkefølgeDet er tilgjengelig med Last-in First-out (LIFO) minnetildelingssystemDette minnet er tilgjengelig via komplekse minnestyringsteknikker som inkluderer Young Generation, Old eller Tenured Generation og Permanent Generation.
LivStackminne eksisterer bare så lenge den gjeldende metoden kjørerHaugplass eksisterer så lenge applikasjonen kjører
EffektivitetForholdsvis mye raskere å tildele sammenlignet med dyngTregere å fordele sammenlignet med stack
Tildeling / omfordelingDette minnet blir automatisk tildelt og distribuert når en metode kalles og returneres henholdsvisHaugeplass tildeles når nye objekter opprettes og distribueres av Gargabe Collector når de ikke lenger er referert til

6. Konklusjon

Stack og heap er to måter Java tildeler minne på. I denne artikkelen forsto vi hvordan de fungerer og når vi skal bruke dem til å utvikle bedre Java-programmer.

For å lære mer om Memory Management i Java, ta en titt på denne artikkelen her. Vi diskuterte også JVM Garbage Collector som diskuteres kort i denne artikkelen.