I Java er minnestyring prosessen med tildeling og deallokering av objekter, kalt minnestyring. Java utfører minnebehandling automatisk. Java bruker et automatisk minnebehandlingssystem kalt a søppelmann . Dermed er vi ikke pålagt å implementere minneadministrasjonslogikk i applikasjonen vår. Java-minneadministrasjon deler seg i to hoveddeler:
mia khalifa alder
JVM-minnestruktur
JVM lager forskjellige dataområder for kjøretid i en haug. Disse områdene brukes under programkjøringen. Minneområdene blir ødelagt når JVM går ut, mens dataområdene blir ødelagt når tråden går ut.
Metodeområde
Metodeområdet er en del av haugminnet som deles mellom alle trådene. Det opprettes når JVM starter opp. Den brukes til å lagre klassestruktur, superklassenavn, grensesnittnavn og konstruktører. JVM lagrer følgende typer informasjon i metodeområdet:
- Et fullt kvalifisert navn av en type (f.eks. streng)
- Typens modifikatorer
- Types direkte superklassenavn
- En strukturert liste over de fullt kvalifiserte navnene på supergrensesnitt.
Heap Area
Heap lagrer de faktiske objektene. Det opprettes når JVM starter opp. Brukeren kan kontrollere haugen om nødvendig. Den kan være av fast eller dynamisk størrelse. Når du bruker et nytt nøkkelord, oppretter JVM en forekomst for objektet i en haug. Mens referansen til det objektet lagres i stabelen. Det finnes bare én haug for hver kjørende JVM-prosess. Når haugen blir full, samles søppelet. For eksempel:
StringBuilder sb= new StringBuilder();
Utsagnet ovenfor oppretter et objekt av StringBuilder-klassen. Objektet allokerer til haugen, og referansen sb allokerer til stack. Heap er delt inn i følgende deler:
- Ung generasjon
- Overlevende plass
- Gammel generasjon
- Permanent generasjon
- Kodebuffer
Referansetype
Det er fire typer referanser: Sterk , Svak , Myk , og Fantomreferanse . Forskjellen mellom referansetypene er at gjenstandene på haugen de refererer til er kvalifisert for søppelhenting under de forskjellige kriteriene.
Sterk referanse: Det er veldig enkelt da vi bruker det i vår daglige programmering. Enhver gjenstand som har sterk referanse knyttet til seg er ikke kvalifisert for søppelinnsamling. Vi kan skape en sterk referanse ved å bruke følgende uttalelse:
StringBuilder sb= new StringBuilder();
Svak referanse: Den overlever ikke etter neste søppelhentingsprosess. Hvis vi ikke er sikre på når dataene vil bli forespurt på nytt. I denne tilstanden kan vi lage en svak referanse til den. I tilfelle, hvis søppelsamleren behandler, ødelegger den gjenstanden. Når vi igjen prøver å hente det objektet, får vi en nullverdi. Det er definert i java.lang.ref.WeakReference klasse. Vi kan lage en svak referanse ved å bruke følgende utsagn:
WeakReference reference = new WeakReference(new StringBuilder());
Myk referanse: Den samles inn når applikasjonen har lite minne. Søppelsamleren samler ikke de mykt tilgjengelige gjenstandene. Alle myke refererte objekter samles før det kaster en OutOfMemoryError. Vi kan lage en myk referanse ved å bruke følgende utsagn:
SoftReference reference = new SoftReference(new StringBuilder());
Fantomreferanse: Den er tilgjengelig i java.lang.ref pakke. Det er definert i java.lang.ref.PhantomReference klasse. Gjenstanden som kun har fantomreferanse som peker på dem, kan samles når søppelsamleren ønsker å samle. Vi kan lage en fantomreferanse ved å bruke følgende uttalelse:
PhantomReference reference = new PhantomReference(new StringBuilder());
Stableområde
Stack Area genereres når en tråd opprettes. Den kan ha enten fast eller dynamisk størrelse. Stabelminnet tildeles per tråd. Den brukes til å lagre data og delresultater. Den inneholder referanser til haugobjekter. Den har også selve verdien i stedet for en referanse til et objekt fra haugen. Variablene som er lagret i stabelen har en viss synlighet, kalt scope.
1 milliard til million
Stabelramme: Stack frame er en datastruktur som inneholder trådens data. Tråddata representerer tilstanden til tråden i gjeldende metode.
- Den brukes til å lagre deler av resultater og data. Den utfører også dynamisk kobling, verdier returneres etter metoder og ekspedisjonsunntak.
- Når en metode påkaller, opprettes en ny ramme. Det ødelegger rammen når påkallelsen av metoden er fullført.
- Hver ramme inneholder egen Local Variable Array (LVA), Operand Stack (OS) og Frame Data (FD).
- Størrelsene på LVA, OS og FD ble bestemt på kompileringstidspunktet.
- Bare én ramme (rammen for utførelsesmetoden) er aktiv til enhver tid i en gitt kontrolltråd. Denne rammen kalles gjeldende ramme, og metoden er kjent som gjeldende metode. Metodeklassen kalles gjeldende klasse.
- Rammen stopper gjeldende metode, hvis metoden påkaller en annen metode eller hvis metoden fullføres.
- Rammen opprettet av en tråd er lokal for den tråden og kan ikke refereres til av noen annen tråd.
Native Method Stack
Det er også kjent som C-stack. Det er en stabel for innfødt kode skrevet på et annet språk enn Java. Java Native Interface (JNI) kaller den opprinnelige stabelen. Ytelsen til den opprinnelige stabelen avhenger av operativsystemet.
PC-registre
Hver tråd har et Program Counter-register (PC) tilknyttet seg. PC-registeret lagrer returadressen eller en innfødt peker. Den inneholder også adressen til JVM-instruksjonene som utføres for øyeblikket.
Arbeid av søppelsamler
Oversikt over søppelsamler
Når et program kjøres i Java, bruker det minne på forskjellige måter. Haugen er en del av minnet der objekter lever. Det er den eneste delen av minnet som er involvert i søppelinnsamlingsprosessen. Det er også kjent som søppelhaug. All søppelhenting sørger for at haugen har så mye ledig plass som mulig. Søppelsamlerens funksjon er å finne og slette gjenstander som ikke kan nås.
Objekttildeling
Når et objekt allokerer, kontrollerer JRockit JVM størrelsen på objektet. Den skiller mellom små og store gjenstander. Den lille og store størrelsen avhenger av JVM-versjonen, haugstørrelsen, søppeloppsamlingsstrategien og plattformen som brukes. Størrelsen på et objekt er vanligvis mellom 2 og 128 KB.
java string concat
De små gjenstandene lagres i Thread Local Area (TLA) som er en ledig del av haugen. TLA synkroniserer ikke med andre tråder. Når TLA blir full, ber den om ny TLA.
På den annen side, store gjenstander som ikke passer inn i TLA direkte allokert inn i haugen. Hvis en tråd bruker den unge plassen, lagres den direkte i den gamle plassen. Det store objektet krever mer synkronisering mellom trådene.
Hva gjør Java Garbage Collector?
JVM styrer søppelsamleren. JVM bestemmer når søppelhentingen skal utføres. Vi kan også be JVM om å drive søppelsamleren. Men det er ingen garanti under noen betingelser for at JVM vil overholde. JVM kjører søppelsamleren hvis den registrerer at minnet begynner å bli lite. Når Java-program ber om for søppelsamleren, innvilger JVM vanligvis forespørselen på kort tid. Den sørger ikke for at forespørslene godtas.
Poenget å forstå er at ' når en gjenstand blir kvalifisert for søppelhenting? '
registeroverføringslogikk
Hvert Java-program har mer enn én tråd. Hver tråd har sin utførelsesstabel. Det er en tråd å kjøre i Java-program som er en main()-metode. Nå kan vi si at et objekt er kvalifisert for søppelinnsamling når ingen levende tråd har tilgang til det. Søppelsamleren anser den gjenstanden som berettiget til sletting. Hvis et program har en referansevariabel som refererer til et objekt, den referansevariabelen tilgjengelig for levende tråd, kalles dette objektet tilgjengelig .
Her oppstår et spørsmål om at ' Kan en Java-applikasjon gå tom for minne? '
Svaret er ja. Søppeloppsamlingssystemet forsøker å hente gjenstander fra minnet når de ikke er i bruk. Skjønt, hvis du vedlikeholder mange levende gjenstander, garanterer ikke søppelinnsamling at det er nok minne. Bare tilgjengelig minne vil bli administrert effektivt.
Typer søppelinnsamling
Det er fem typer søppelinnsamling er som følger:
Merk og sveip algoritme
JRockit JVM bruker merke- og sveipealgoritmen for å utføre søppelinnsamlingen. Den inneholder to faser, markeringsfasen og sveipefasen.
Merk fase: Objekter som er tilgjengelige fra trådene, de opprinnelige håndtakene og andre GC-rotkilder er merket som live. Hvert objekttre har mer enn ett rotobjekt. GC-rot er alltid tilgjengelig. Altså ethvert objekt som har en søppeloppsamlingsrot ved roten. Den identifiserer og merker alle gjenstander som er i bruk, og de resterende kan betraktes som søppel.
Feiefase: I denne fasen krysses haugen for å finne gapet mellom de levende objektene. Disse hullene registreres i gratislisten og er tilgjengelige for ny objektallokering.
Det er to forbedrede versjoner av mark and sweep:
full huggorm
Samtidig Mark og Sweep
Det lar trådene fortsette å løpe under en stor del av søppelhentingen. Det finnes følgende typer merking:
Parallell Mark og Sweep
Den bruker all tilgjengelig CPU i systemet for å utføre søppeloppsamlingen så raskt som mulig. Det kalles også den parallelle søppelsamleren. Tråder kjøres ikke når den parallelle søppelinnsamlingen kjøres.
Fordeler med Mark and Sweep
- Det er en tilbakevendende prosess.
- Det er en uendelig løkke.
- Ingen ekstra overhead tillatt under utførelse av en algoritme.
Ulemper med Mark and Sweep
- Den stopper den normale programkjøringen mens søppeloppsamlingsalgoritmen kjører.
- Den kjører flere ganger på et program.