logo

Hukommelseshåndtering i Java

I Java er hukommelsesstyring processen med tildeling og de-allokering af objekter, kaldet hukommelsesstyring. Java udfører hukommelsesstyring automatisk. Java bruger et automatisk hukommelsesstyringssystem kaldet a skraldemand . Vi er således ikke forpligtet til at implementere hukommelsesstyringslogik i vores applikation. Java-hukommelseshåndtering opdeles i to hoveddele:

maskinskrift for hver
    JVM hukommelsesstruktur Affaldssamlerens arbejde

JVM hukommelsesstruktur

JVM opretter forskellige driftstidsdataområder i en bunke. Disse områder bruges under programafviklingen. Hukommelsesområderne ødelægges, når JVM afsluttes, hvorimod dataområderne ødelægges, når tråden forlades.

Hukommelseshåndtering i Java

Metodeområde

Metodeområdet er en del af heap-hukommelsen, som deles mellem alle trådene. Det opstår, når JVM starter op. Det bruges til at gemme klassestruktur, superklassenavn, grænsefladenavn og konstruktører. JVM gemmer følgende typer information i metodeområdet:

  • Et fuldt kvalificeret navn af en type (f.eks.: streng)
  • Typens modifikatorer
  • Typens direkte superklassenavn
  • En struktureret liste over de fuldt kvalificerede navne på supergrænseflader.

Dyngeområde

Heap gemmer de faktiske objekter. Det opstår, når JVM starter op. Brugeren kan styre heapen, hvis det er nødvendigt. Det kan være af fast eller dynamisk størrelse. Når du bruger et nyt nøgleord, opretter JVM en instans for objektet i en heap. Mens referencen for det objekt lagres i stakken. Der findes kun én heap for hver kørende JVM-proces. Når dyngen bliver fuld, bliver affaldet samlet. For eksempel:

 StringBuilder sb= new StringBuilder(); 

Ovenstående sætning opretter et objekt af StringBuilder-klassen. Objektet allokerer til heapen, og referencen sb allokerer til stakken. Heap er opdelt i følgende dele:

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

Referencetype

Der er fire typer referencer: Stærk , Svag , Blød , og Fantom reference . Forskellen mellem typerne af referencer er, at objekterne på bunken, de refererer til, er berettiget til affaldsindsamling under de forskellige kriterier.

Stærk reference: Det er meget enkelt, da vi bruger det i vores daglige programmering. Enhver genstand, der har en stærk reference knyttet til sig, er ikke berettiget til affaldsindsamling. Vi kan skabe en stærk reference ved at bruge følgende udsagn:

 StringBuilder sb= new StringBuilder(); 

Svag reference: Det overlever ikke efter den næste affaldsindsamlingsproces. Hvis vi ikke er sikre på, hvornår dataene vil blive anmodet om igen. I denne tilstand kan vi skabe en svag reference til det. I tilfælde af, at hvis affaldssamleren behandler, ødelægger den genstanden. Når vi igen forsøger at hente det objekt, får vi en nulværdi. Det er defineret i java.lang.ref.WeakReference klasse. Vi kan skabe en svag reference ved at bruge følgende udsagn:

 WeakReference reference = new WeakReference(new StringBuilder()); 

Blød reference: Det indsamles, når programmet er ved at løbe tør for hukommelse. Affaldssamleren samler ikke de let tilgængelige genstande. Alle objekter med bløde referencer samles, før de kaster en OutOfMemoryError. Vi kan oprette en blød reference ved at bruge følgende udsagn:

 SoftReference reference = new SoftReference(new StringBuilder()); 

Fantom reference: Den fås i java.lang.ref pakke. Det er defineret i java.lang.ref.PhantomReference klasse. Objektet, som kun har fantomreference, der peger på dem, kan indsamles, når skraldeopsamleren ønsker at indsamle. Vi kan oprette en fantomreference ved at bruge følgende sætning:

 PhantomReference reference = new PhantomReference(new StringBuilder()); 

Stakområde

Stack Area genereres, når en tråd oprettes. Det kan være af enten fast eller dynamisk størrelse. Stakhukommelsen tildeles pr. tråd. Det bruges til at gemme data og delvise resultater. Den indeholder referencer til heap-objekter. Den har også selve værdien i stedet for en reference til et objekt fra dyngen. Variablerne, som er gemt i stakken, har en vis synlighed, kaldet scope.

1 milliard til mio

Stakramme: Stack frame er en datastruktur, der indeholder trådens data. Tråddata repræsenterer trådens tilstand i den aktuelle metode.

  • Det bruges til at gemme delvise resultater og data. Det udfører også dynamisk sammenkædning, værdier returneres af metoder og afsendelsesundtagelser.
  • Når en metode påberåber sig, oprettes en ny ramme. Det ødelægger rammen, når påkaldelsen af ​​metoden er færdig.
  • Hver frame indeholder egne Local Variable Array (LVA), Operand Stack (OS) og Frame Data (FD).
  • Størrelserne af LVA, OS og FD bestemt på kompileringstidspunktet.
  • Kun én ramme (rammen til udførelsesmetoden) er aktiv på ethvert tidspunkt i en given kontroltråd. Denne ramme kaldes den aktuelle ramme, og dens metode er kendt som den aktuelle metode. Metodens klasse kaldes den aktuelle klasse.
  • Rammen stopper den aktuelle metode, hvis dens metode kalder en anden metode, eller hvis metoden fuldføres.
  • Rammen oprettet af en tråd er lokal for den tråd og kan ikke henvises til af nogen anden tråd.

Native Method Stack

Det er også kendt som C-stak. Det er en stak til indfødt kode skrevet på et andet sprog end Java. Java Native Interface (JNI) kalder den oprindelige stak. Ydeevnen af ​​den oprindelige stak afhænger af operativsystemet.

PC registre

Hver tråd har et programtællerregister (PC) tilknyttet. PC-registret gemmer returadressen eller en indfødt pointer. Den indeholder også adressen på de JVM-instruktioner, der i øjeblikket udføres.

Affaldssamlers arbejde

Garbage Collector Oversigt

Når et program kører i Java, bruger det hukommelse på forskellige måder. Hoben er en del af hukommelsen, hvor objekter lever. Det er den eneste del af hukommelsen, der er involveret i affaldsindsamlingsprocessen. Det er også kendt som affaldssamling. Al affaldsindsamling sørger for, at dyngen har så meget ledig plads som muligt. Affaldssamlerens funktion er at finde og slette de genstande, der ikke kan nås.

Objektallokering

Når et objekt allokerer, kontrollerer JRockit JVM størrelsen af ​​objektet. Den skelner mellem små og store genstande. Den lille og store størrelse afhænger af JVM-versionen, bunkestørrelsen, affaldsindsamlingsstrategien og den anvendte platform. Størrelsen af ​​et objekt er normalt mellem 2 og 128 KB.

linkedlist java

De små genstande opbevares i Thread Local Area (TLA), som er en fri del af dyngen. TLA synkroniserer ikke med andre tråde. Når TLA bliver fuld, anmoder den om ny TLA.

På den anden side, store objekter, der ikke passer inde i TLA direkte allokeret i heapen. Hvis en tråd bruger det unge rum, lagres det direkte i det gamle rum. Det store objekt kræver mere synkronisering mellem trådene.

Hvad gør Java Garbage Collector?

JVM styrer skraldeopsamleren. JVM bestemmer, hvornår affaldsindsamlingen skal udføres. Vi kan også anmode JVM om at drive skraldesamleren. Men der er ingen garanti under nogen betingelser for, at JVM vil overholde. JVM kører skraldeopsamleren, hvis den registrerer, at hukommelsen er ved at løbe tør. Når Java-programanmodning for skraldeopsamleren, imødekommer JVM normalt anmodningen på kort tid. Det sikrer ikke, at anmodningerne accepteres.

Pointen at forstå er, at ' hvornår en genstand bliver berettiget til affaldsindsamling? '

powershell multiline kommentar

Hvert Java-program har mere end én tråd. Hver tråd har sin udførelsesstak. Der er en tråd at køre i Java-program, som er en main() metode. Nu kan vi sige, at et objekt er berettiget til affaldsindsamling, når ingen levende tråd kan få adgang til det. Skraldemanden anser den genstand for at være berettiget til sletning. Hvis et program har en referencevariabel, der refererer til et objekt, denne referencevariabel tilgængelig for levende tråd, kaldes dette objekt tilgængelig .

Her opstår et spørgsmål om, at ' Kan et Java-program løbe tør for hukommelse? '

Svaret er ja. Skraldeopsamlingssystemet forsøger at hente genstande fra hukommelsen, når de ikke er i brug. Men hvis du vedligeholder mange levende genstande, garanterer affaldsopsamling ikke, at der er nok hukommelse. Kun tilgængelig hukommelse vil blive administreret effektivt.

Typer af affaldsopsamling

Der er fem typer affaldsindsamling er som følger:

    Seriel GC:Den bruger mark and sweeps-tilgangen til unge og gamle generationer, som er mindre og større GC.Parallel GC:Det ligner seriel GC bortset fra, at det afføder N (antallet af CPU-kerner i systemet) tråde til den unge generations affaldsopsamling.Parallel Old GC:Det ligner parallel GC, bortset fra at det bruger flere tråde for begge generationer.Concurrent Mark Sweep (CMS)-samler:Den klarer affaldsindsamlingen for den gamle generation. Du kan begrænse antallet af tråde i CMS-samleren ved hjælp af XX:ParalleCMSThreads=JVM mulighed . Det er også kendt som Concurrent Low Pause Collector.G1 skraldeopsamler:Den blev introduceret i Java 7. Dens formål er at erstatte CMS-samleren. Det er en parallel, samtidig og CMS-samler. Der er ingen ung og gammel generation plads. Den deler dyngen i flere lige store dynger. Den indsamler først regionerne med færre livedata.

Mark and Sweep-algoritme

JRockit JVM bruger mærket og sweep-algoritmen til at udføre affaldsindsamlingen. Den indeholder to faser, markeringsfasen og sweepfasen.

Markeringsfase: Objekter, der er tilgængelige fra trådene, indbyggede håndtag og andre GC-rodkilder, er markeret som live. Hvert objekttræ har mere end ét rodobjekt. GC root er altid tilgængelig. Altså enhver genstand, der har en affaldsopsamlingsrod ved roden. Den identificerer og markerer alle genstande, der er i brug, og de resterende kan betragtes som skrald.

Hukommelseshåndtering i Java

Fejefase: I denne fase krydses bunken for at finde mellemrummet mellem de levende objekter. Disse huller registreres i den frie liste og er tilgængelige for ny objektallokering.

Der er to forbedrede versioner af mark and sweep:

fuld hugorm
    Samtidig Mark og Sweep Parallel Mark og Sweep

Samtidig Mark og Sweep

Det gør det muligt for trådene at fortsætte med at løbe under en stor del af affaldsindsamlingen. Der er følgende typer mærkning:

    Indledende mærkning:Den identificerer rodsættet af levende objekter. Det gøres, mens tråde er sat på pause.Samtidig markering:I denne markering følges referencen fra rodsættet. Den finder og markerer resten af ​​de levende genstande i en bunke. Det gøres mens tråden kører.Præ-rengøringsmærkning:Den identificerer de ændringer, der er foretaget ved samtidig markering. Andre levende objekter markeret og fundet. Det gøres mens trådene kører.Afsluttende karakter:Den identificerer de ændringer, der er foretaget ved præ-rengøringsmærkning. Andre levende objekter markeret og fundet. Det gøres, mens tråde er sat på pause.

Parallel Mark og Sweep

Den bruger al tilgængelig CPU i systemet til at udføre affaldsindsamlingen så hurtigt som muligt. Det kaldes også den parallelle skraldeopsamler. Tråde udføres ikke, når den parallelle affaldsindsamling udføres.

Fordele ved Mark and Sweep

  • Det er en tilbagevendende proces.
  • Det er en uendelig løkke.
  • Ingen yderligere overhead tilladt under udførelsen af ​​en algoritme.

Ulemper ved Mark and Sweep

  • Den stopper den normale programafvikling, mens skraldeopsamlingsalgoritmen kører.
  • Det kører flere gange på et program.