Java >> Java tutorial >  >> Tag >> Stack

Hvor lever Java's String Constant Pool, heapen eller stakken?

1. Introduktion

Hver gang vi erklærer en variabel eller opretter et objekt, gemmes den i hukommelsen. På et højt niveau opdeler Java hukommelsen i to blokke:stak og heap. Begge hukommelser gemmer bestemte typer data og har forskellige mønstre for deres lagring og adgang.

I denne øvelse vil vi se på forskellige parametre og lære, hvilket område der er det mest passende at gemme strengen konstant pool.

2. String Constant Pool

strengen konstant pool er et særligt hukommelsesområde. Når vi erklærer en streng bogstaveligt, opretter JVM objektet i poolen og gemmer dets reference på stakken. Før du opretter hver streng objekt i hukommelsen, udfører JVM nogle trin for at reducere hukommelsesomkostningerne.

Strengkonstantpuljen bruger et hashmap i dens gennemførelse. Hver bucket af Hashmap indeholder en liste over streng s med samme hash-kode. I tidligere versioner af Java var lagerområdet til poolen en fast størrelse og kunne ofte føre til "Kunne ikke reservere nok plads til objektbunken"  fejl.

Når systemet indlæser klasserne, String bogstaver i alle klasser går til puljen på applikationsniveau. Det er på grund af det faktum, at lige streng bogstaver af forskellige klasser skal være det samme objekt . I disse situationer bør data i puljen være tilgængelige for hver klasse uden nogen afhængighed.

Normalt gemmer stakken de data, der er kortvarige. Det inkluderer lokale primitive variabler, referencer til heap-objekter og metoder under udførelse. Heap tillader dynamisk hukommelsesallokering, gemmer Java-objekter og JRE-klasser under kørsel.

Heapen tillader global adgang, og datalagre i heapen er tilgængelige for alle tråde i løbet af applikationens levetid, hvorimod datalagrene på stakken har det private omfang, og kun ejertråden kan få adgang til dem.

Stakken gemmer dataene i sammenhængende hukommelsesblokke og tillader tilfældig adgang. Hvis en klasse har brug for en tilfældig streng fra poolen, er den muligvis ikke tilgængelig på grund af LIFO-reglen (sidst-ind-først-ud) i stakken. I modsætning hertil allokerer heapen hukommelsen dynamisk og giver os adgang til dataene på enhver måde.

Lad os antage, at vi har et kodestykke bestående af forskellige typer variabler. Stakken gemmer værdien af ​​int bogstavelig og referencer til String og demoobjekter. Værdien af ​​ethvert objekt vil blive gemt i heapen og hele strengen bogstaver går i puljen inde i dyngen:

De variabler, der er oprettet på stakken, deallokeres, så snart tråden fuldfører eksekveringen. I modsætning hertil genvinder en skraldemand ressourcerne i dyngen. På samme måde samler skraldeopsamleren de ikke-refererede genstande fra poolen.

Standardstørrelsen af ​​puljen kan variere på de forskellige platforme. Under alle omstændigheder er den stadig meget større end den tilgængelige stakstørrelse. Før JDK 7 var poolen en del af permgenrummet, og fra JDK 7 til nu er den en del af hovedbunkens hukommelse.

3. Konklusion

I denne korte artikel lærte vi om lagerområdet for String konstant pool. Stack og heap har forskellige egenskaber til at gemme og få adgang til data. Fra hukommelsesallokering til dens adgang og tilgængelighed er en heap det mest egnede område til at gemme String-konstantpuljen.

Faktisk har poolen aldrig været en del af stakhukommelsen.


Java tag