logo

Minnehåndtering i Java

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 Arbeidet med søppelsamleren

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.

Minnehåndtering i Java

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:

    Seriell GC:Den bruker mark and sweeps-tilnærmingen for unge og gamle generasjoner, som er mindre og større GC.Parallell GC:Det ligner på seriell GC bortsett fra at det skaper N (antall CPU-kjerner i systemet) tråder for den unge generasjonens søppelinnsamling.Parallell gammel GC:Den ligner på parallell GC, bortsett fra at den bruker flere tråder for begge generasjoner.Concurrent Mark Sweep (CMS) Collector:Det gjør søppelinnsamlingen for den gamle generasjonen. Du kan begrense antall tråder i CMS-samleren ved å bruke XX:ParalleCMSThreads=JVM-alternativ . Det er også kjent som Concurrent Low Pause Collector.G1 søppeloppsamler:Den ble introdusert i Java 7. Målet er å erstatte CMS-samleren. Det er en parallell, samtidig og CMS-samler. Det er ingen ung og gammel generasjonsplass. Den deler haugen i flere like store hauger. Den samler først inn regionene med mindre live-data.

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.

Minnehåndtering i Java

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 Parallell Mark og Sweep

Samtidig Mark og Sweep

Det lar trådene fortsette å løpe under en stor del av søppelhentingen. Det finnes følgende typer merking:

    Innledende merking:Den identifiserer rotsettet av levende objekter. Det gjøres mens trådene er satt på pause.Samtidig merking:I denne markeringen følges referansen fra rotsettet. Den finner og markerer resten av de levende gjenstandene i en haug. Det gjøres mens tråden går.Merking før rengjøring:Den identifiserer endringene som er gjort ved samtidig merking. Andre levende gjenstander merket og funnet. Det gjøres mens trådene løper.Sluttmerking:Den identifiserer endringene som er gjort ved forhåndsrengjøringsmerking. Andre levende objekter merket og funnet. Det gjøres mens trådene er satt på pause.

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.