logo

Stack vs Heap Java

I Java, Minnehåndtering er en viktig prosess. Det administreres automatisk av Java. JVM deler minnet i to deler: stable minne og haugminne. Fra Javas perspektiv er begge viktige minneområder, men begge brukes til forskjellige formål. De stor forskjell mellom stabelminne og heapminne er at stabelen brukes til å lagre rekkefølgen på metodeutførelse og lokale variabler mens heap-minnet lagrer objektene og den bruker dynamisk minneallokering og deallokering. I denne delen vil vi diskutere forskjellene mellom stack og heap i detalj.

Stack vs Heap Java

Stable minne

Stabelminnet er en fysisk plass (i RAM) som er allokert til hver tråd ved kjøring. Den opprettes når en tråd opprettes. Minnehåndtering i stabelen følger LIFO-rekkefølgen (Last-In-First-Out) fordi den er tilgjengelig globalt. Den lagrer variablene, referanser til objekter og delresultater. Minne tildelt til stableliv til funksjonen kommer tilbake. Hvis det ikke er plass til å lage de nye objektene, kaster denjava.lang.StackOverFlowError. Omfanget av elementene er begrenset til deres tråder. De JVM oppretter en egen stabel for hver tråd.

Heap minne

Den opprettes når JVM starter opp og brukes av applikasjonen så lenge applikasjonen kjører. Den lagrer objekter og JRE-klasser. Når vi lager objekter, opptar det plass i haugminnet mens referansen til det objektet skaper i stabelen. Den følger ikke noen rekkefølge som stabelen. Den håndterer minneblokkene dynamisk. Det betyr at vi ikke trenger å håndtere minnet manuelt. For å administrere minnet automatisk, Java gir søppelsamleren som sletter gjenstandene som ikke lenger brukes. Minne som er allokert til heap-liv til en hendelse, enten programmet avsluttes eller minnefritt, ikke forekommer. Elementene er globalt tilgjengelige i applikasjonen. Det er en felles minneplass som deles med alle trådene. Hvis haugen er full, kaster denjava.lang.OutOfMemoryError. Heap-minnet er videre delt inn i følgende minneområder:

  • Ung generasjon
  • Overlevende plass
  • Gammel generasjon
  • Permanent generasjon
  • Kodebuffer

Følgende bilde viser tildelingen av stabelminne og heap-plass.

Stack vs Heap Java

Forskjellen mellom stabel og haugminne

Følgende tabell oppsummerer alle de store forskjellene mellom stabelminne og heap-plass.

Parameter Stable minne Heap Space
applikasjon Den lagrer varer som har svært kort levetid som f.eks metoder, variabler, og referansevariabler av gjenstandene. Den lagrer gjenstander og Java Runtime Environment ( JRE ) klasser.
Bestilling Den følger LIFO rekkefølge. Den følger ingen rekkefølge fordi den er en dynamisk minneallokering og ikke har noe fast mønster for tildeling og deallokering av minneblokker.
Fleksibilitet Det er ikke fleksibel fordi vi ikke kan endre det tildelte minnet. Det er fleksibel fordi vi kan endre det tildelte minnet.
Effektivitet Det har raskere tilgang, allokering og deallokering. Det har langsommere tilgang, allokering og deallokering.
Minnestørrelse Det er mindre i størrelse. Det er større i størrelse.
Java-alternativer som brukes Vi kan øke stabelstørrelsen ved å bruke JVM-alternativet -Xss. Vi kan øke eller redusere haugminnestørrelsen ved å bruke alternativene - Xmx og -Xms JVM.
Synlighet eller omfang Variablene er kun synlige for eiertråden. Det er synlig for alle tråder.
Generering av rom Når en tråd er opprettet, tildeler operativsystemet stabelen automatisk. For å opprette haugeplassen for applikasjonen, kaller språket først operativsystemet under kjøring.
Fordeling Det lages en egen stabel for hvert objekt. Den deles blant alle trådene.
Unntakskast JVM kaster java.lang.StackOverFlowError hvis stabelstørrelsen er større enn grensen. Øk stabelstørrelsen for å unngå denne feilen. JVM kaster java.lang.OutOfMemoryError hvis JVM ikke er i stand til å opprette en ny innebygd metode.
Tildeling/ Deallokering Det gjøres automatisk av kompilator . Det gjøres manuelt av Programmerer .
Koste Dens kostnad er mindre . Dens kostnad er mer i forhold til stack.
Gjennomføring Gjennomføringen er hard . Gjennomføringen er lett .
Rekkefølge for tildeling Minnetildeling er kontinuerlige . Minne tildelt i tilfeldig rekkefølge.
Tråd-sikkerhet Den er trådsikker fordi hver tråd har sin egen stabel. Det er ikke trådsikkert, så riktig synkronisering av kode er nødvendig.