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.
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.
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. |