logo

Stack vs Heap Java

I Java, hukommelseshåndtering er en livsvigtig proces. Det styres automatisk af Java. JVM deler hukommelsen i to dele: stak hukommelse og bunkehukommelse. Fra Javas perspektiv er begge vigtige hukommelsesområder, men begge bruges til forskellige formål. Det stor forskel mellem stak-hukommelse og heap-hukommelse er, at stakken bruges til at gemme rækkefølgen af ​​metodeudførelse og lokale variabler, mens heap-hukommelsen gemmer objekterne, og den bruger dynamisk hukommelsesallokering og -deallokering. I dette afsnit vil vi diskutere forskellene mellem stack og heap i detaljer.

Stack vs Heap Java

Stakhukommelse

Stakhukommelsen er et fysisk rum (i RAM), der er allokeret til hver tråd under kørsel. Det oprettes, når en tråd opretter. Hukommelseshåndtering i stakken følger LIFO-rækkefølgen (Last-In-First-Out), fordi den er tilgængelig globalt. Det gemmer variablerne, referencer til objekter og delresultater. Hukommelse allokeret til stableliv indtil funktionen vender tilbage. Hvis der ikke er plads til at skabe de nye objekter, kaster denjava.lang.StackOverFlowError. Omfanget af elementerne er begrænset til deres tråde. Det JVM opretter en separat stak for hver tråd.

Heap Hukommelse

Den oprettes, når JVM'en starter op og bruges af applikationen, så længe applikationen kører. Det gemmer objekter og JRE-klasser. Når vi opretter objekter, optager det plads i heap-hukommelsen, mens referencen for det objekt skaber i stakken. Den følger ikke nogen rækkefølge som stakken. Den håndterer hukommelsesblokkene dynamisk. Det betyder, at vi ikke behøver at håndtere hukommelsen manuelt. For at styre hukommelsen automatisk, Java leverer affaldssamleren, der sletter de genstande, som ikke længere bliver brugt. Hukommelse allokeret til heap-liv, indtil en enkelt begivenhed, enten program afsluttet eller hukommelsesfri, ikke forekommer. Elementerne er globalt tilgængelige i applikationen. Det er et fælles hukommelsesrum, der deles med alle trådene. Hvis dyngepladsen er fuld, kaster denjava.lang.OutOfMemoryError. Heap-hukommelsen er yderligere opdelt i følgende hukommelsesområder:

  • Ung generation
  • Overlevende plads
  • Gammel generation
  • Permanent generation
  • Kode cache

Følgende billede viser tildelingen af ​​stakhukommelse og heapplads.

Stack vs Heap Java

Forskellen mellem stak- og heap-hukommelse

Følgende tabel opsummerer alle de store forskelle mellem stakhukommelse og heap-plads.

Parameter Stakhukommelse Heap Space
Ansøgning Den opbevarer varer, der har en meget kort levetid som f.eks metoder, variabler, og referencevariabler af genstandene. Det gemmer genstande og Java Runtime Environment ( JRE ) klasser.
Bestilling Den følger LIFO bestille. Det følger ikke nogen rækkefølge, fordi det er en dynamisk hukommelsesallokering og ikke har noget fast mønster for tildeling og deallokering af hukommelsesblokke.
Fleksibilitet det er ikke fleksibel fordi vi ikke kan ændre den tildelte hukommelse. det er fleksibel fordi vi kan ændre den tildelte hukommelse.
Effektivitet Det har hurtigere adgang, allokering og deallokering. Det har langsommere adgang, allokering og deallokering.
Hukommelsesstørrelse det er mindre i størrelse. det er større i størrelse.
Brugt Java-indstillinger Vi kan øge stakstørrelsen ved at bruge JVM-indstillingen -Xss. Vi kan øge eller mindske størrelsen på heap-hukommelsen ved at bruge - Xmx og -Xms JVM mulighederne.
Synlighed eller omfang Variablerne er kun synlige for ejertråden. Det er synligt for alle tråde.
Generering af rum Når en tråd oprettes, allokerer operativsystemet automatisk stakken. For at skabe heap-pladsen til applikationen kalder sproget først operativsystemet under kørsel.
Fordeling Der oprettes en separat stak for hvert objekt. Det deles blandt alle trådene.
Undtagelseskast JVM kaster java.lang.StackOverFlowError hvis stakstørrelsen er større end grænsen. For at undgå denne fejl skal du øge stakstørrelsen. JVM kaster java.lang.OutOfMemoryError hvis JVM ikke er i stand til at oprette en ny indbygget metode.
Tildeling/ Deallokering Det gøres automatisk af compiler . Det gøres manuelt af programmør .
Koste Dens omkostninger er mindre . Dens omkostninger er mere i forhold til stakken.
Implementering Dens gennemførelse er hårdt . Dens gennemførelse er let .
Rækkefølge for tildeling Hukommelsestildeling er sammenhængende . Hukommelse tildelt i tilfældig bestille.
Tråd-sikkerhed Det er trådsikkert, fordi hver tråd har sin egen stak. Det er ikke trådsikkert, så korrekt synkronisering af kode er påkrævet.