what is garbage collection java
Denne vejledning forklarer, hvad der er Garbage Collection i Java, og hvordan fungerer Garbage Collector. Du vil også lære om algoritmer til affaldssamling:
De læsere, der har kendskab til C / C ++, skal være opmærksomme på, at det er programmørens ansvar at oprette og slette objekterne i C / C ++.
Alvorlige fejl opstår, hvis programmøren glemmer at ødelægge de oprettede objekter. Dette skyldes, at manglende ødelæggelse af objekterne kan forårsage “ Ikke mere hukommelse ”Fejl, hukommelseslækager osv.
Denne situation er helt taget hånd om i Java, da der ikke er behov for en programmør til at holde styr på objekterne. Java tager sig af objektdestruktion for os gennem automatisk affaldsindsamling.
=> Besøg her for at lære Java fra bunden.
Processen, hvorved objekter, der ikke længere er i brug, fjernes fra bunkehukommelsen kaldes 'Garbage Collection'. Affaldsindsamlingsteknikken er en del af hukommelsesstyring i Java.
Således i Java ødelægger Garbage Collector alle objekter, der ikke længere er i brug.
Hvad du vil lære:
- Hvad er en affaldssamler i Java?
- Hvordan fungerer affaldssamling i Java?
- Affaldssamlingsalgoritmer i Java
- Konklusion
Hvad er en affaldssamler i Java?
Garbage Collection i Java styres af et program kaldet Garbage Collector.
Garbage Collector kan defineres som et program, der bruges til automatisk at styre hukommelse ved at håndtere objektets allokering.
Vi ved, at de nye objekter på Java-sprog oprettes og tildeles hukommelse ved hjælp af den nye operator. Hukommelsen allokeret til et objekt ved hjælp af en ny operator forbliver allokeret, indtil referencerne bruger dette objekt.
Så snart referencerne ophører, gendannes den hukommelse, som objektet optager. Java håndterer derefter automatisk allokering eller destruktion af objekter, og vi behøver ikke eksplicit at ødelægge objektet.
Denne teknik er Garbage Collection-teknikken i Java, hvor programmørerne ikke behøver at håndtere deallocation af objekter eksplicit.
Bemærk, at hvis programmerne ikke allokerer hukommelsen, når objekterne ikke har brug for den, vil der til sidst ikke være nogen hukommelse tilbage at allokere, og programmerne går ned. Denne situation kaldes en hukommelseslækage.
Affaldssamleren kører altid i baggrunden på en dæmontråd. Garbage Collector betragtes som det bedste eksempel på daemon-tråden.
Garbage Collector kører med det formål at frigive bunkehukommelsen. Det gør det ved at ødelægge objekter, der er 'utilgængelige'.
Hvad er et 'uopnåeligt' objekt?
Et objekt bliver utilgængeligt, når der ikke engang er en enkelt reference tilknyttet.
Overvej følgende kode:
Integer ref_obj = new Integer (5); //ref_obj is a reference to Integer ref_obj = null; //Integer object now becomes unreachable
Som det ses af ovenstående kode, kan et objekt nås, så længe en reference er knyttet til det. I det øjeblik, referenceassociationen fjernes (en indstillingsreference til null i ovenstående tilfælde) bliver objektet utilgængeligt.
Når et objekt bliver utilgængeligt, bliver det berettiget til Garbage Collection (GC).
Hvordan kan vi gøre et objekt berettiget til GC?
Selvom programmøren ikke er forpligtet til at ødelægge objekterne, da de er taget hånd om af GC, kan programmøren i det mindste gøre disse objekter utilgængelige, når de ikke længere er påkrævet.
Ved at gøre dette vil GC samle de uopnåelige genstande og ødelægge dem.
Der er nogle måder at gøre et objekt berettiget til GC ved at gøre det utilgængeligt.
De er:
# 1) Ophæv referencen
Givet en reference tildelt et objekt, hvis dette objekt ikke længere er nødvendigt, så tildel referencen til null.
Student s = new Student (); s = null;
Når s er indstillet til null, kan studentobjektet ikke nås.
# 2) Tildel referencen igen
Dette er en anden måde at gøre objekterne berettigede til GC.
Overvej følgende kode.
Student s1 = new Student (); Student s2 = new Student (); s1 = s2;
Nu, da vi har tildelt s1 til et andet objekt, henvises der til Student-objektet, der refereres til af s1.
# 3) Opret et anonymt objekt
Ved at oprette et anonymt objekt kan vi gøre objekterne berettigede til GC.
Vi kan oprette et anonymt objekt som vist nedenfor:
new Student();
Når vi først gør objekterne berettigede til GC, kan disse objekter måske eller ikke ødelægges straks af GC. Dette skyldes, at vi ikke eksplicit kan tvinge GC til at udføre, når og når vi vil.
Hvornår kører affaldssamleren?
Det er op til JVM at køre Garbage Collector-programmet. Når JVM kører affaldssamleren, ødelægges de uopnåelige genstande. Men alligevel kan vi ikke garantere, hvornår JVM kører.
Selvom vi ikke kan tvinge GC til at udføre, kan vi meget vel anmode om en affaldssamling.
GC kan rekvireres ved hjælp af en af følgende metoder.
# 1) System.gc (): Systemklassen til Java giver en statisk metode gc (), hvor vi kan anmode JVM om at køre Garbage Collector.
# 2) Runtime.getRuntime (). Gc (): Ligesom System.gc () kan vi også bruge gc () -metoden i 'Runtime-klasse' til at anmode JVM om at køre Garbage Collector.
Bemærk: Der er ingen garanti for, at affaldssamleren kører efter en anmodning fra disse to metoder.
Afslutning
Finalisering udføres af Garbage Collector lige før objekterne ødelægges. Som en del af færdiggørelsesteknikken kalder Garbage Collector metoden finalize () på objektet. Metoden finalize () bruges til at udføre oprydningsaktiviteter.
Finaliseringsmetoden () leveres af klassen 'Objekt' og har følgende prototype.
protected void finalize () throws Throwable
Finalize-metoden () påberåbes, når genstanden er indsamlet skrald
Bemærk: Affaldssamleren samler kun de objekter, der oprettes ved hjælp af det nye nøgleord. For andre objekter skal vi bruge metoden finalize () til at udføre oprydningen.
Nedenstående program viser en simpel affaldssamling i Java.
class TestGC{ @Override // finalize method: called on object once // before garbage collecting it protected void finalize() throws Throwable { System.out.println('Garbage collector called'); System.out.println('Object garbage collected : ' + this); } } class Main{ public static void main(String args()){ TestGC gc1=new TestGC(); TestGC gc2=new TestGC(); gc1 = null; //nullify gc1 System.gc(); //request for GC to run gc2 = null; //nullify gc2 Runtime.getRuntime().gc(); //request for GC to run } }
Produktion
I ovenstående program har vi oprettet en klasse TestGC. I denne klasse har vi tilsidesat metoden finalize (). Så i hovedklassen opretter vi to objekter i TestGC-klassen. Først annullerer vi et objekt og kalder System.gc () for at anmode om Garbage Collector.
Dernæst annullerer vi det andet objekt og opkaldsmetoden Runtime.getRuntime.gc () for at anmode om Garbage Collector. Outputtet viser den færdige metodeoutput to gange, hvilket indikerer, at affaldssamleren kørte to gange.
Bemærk: Selvom vi har fået dette output, er det ikke garanteret, at vi hver gang får den samme output. Det afhænger helt af JVM.
Hvordan fungerer affaldssamling i Java?
I dette afsnit vil vi se, hvordan Garbage Collection fungerer i Java.
Under affaldsindsamling ser Garbage Collector Heap-hukommelsen op og “markerer” derefter de uopnåelige objekter. Så ødelægger det dem.
Men problemet opstår, når antallet af objekter stiger. Efterhånden som objekterne stiger, øges tiden, der tager for affaldssamling, da det ser ud til uopnåelige objekter. Det påvirker dog ikke for meget, da de fleste genstande har kort levetid.
Ovenstående adfærd kaldes “Generational Garbage Collection” og skal forbedre JVM-ydelsen. I denne tilgang er hele bunkerummet opdelt i - Young Generation, Old or Tenured Generation og Permanent Generation.
# 1) Unge generationens bunkerum: Alle de nye objekter oprettes i dette rum. Når pladsen er fuld, finder mindre GC sted, hvor alle de døde genstande ødelægges. Den mindre GC-proces er hurtig og hurtig, da de fleste genstande er døde. Objekterne, der overlever den unge generation, flyttes til de ældre generationer.
# 2) Old Generation Heap Space: Denne generation gemmer objekter, der overlever længe. Når den aldersgrænse, der er indstillet for den unge generation, er opfyldt, flyttes objektet til den gamle generation. Når den gamle generation er fyldt, udføres en større GC.
Major GC er langsom, da objekter involveret her er levende objekter. Nogle gange ryddes hele bunkerummet, der inkluderer unge såvel som gamle generationer. Dette kaldes “Fuld GC”.
# 3) Permanent generationL Indtil Java 7 plejede der at være en permanent generation (Perm Gen). Perm Gen-metadata blev brugt af JVM. JVM brugte disse metadata til at beskrive klasser og metoder, der blev brugt i applikationen. Perm Gen blev fjernet i Java 8.
Java 8 Garbage Collection: Perm Gen And Metaspace
Vi har allerede nævnt om Perm Gen-plads, der var til stede indtil Java 7. Men nu i Java 8 repræsenterer JVM klassens metadata ved hjælp af den oprindelige hukommelse kaldet “Metaspace”.
Bortset fra Metaspace er der et nyt flag kaldet “MaxMetaspaceSize”, der begrænser hukommelsen, der bruges til klassemetadata. Hvis der ikke er angivet nogen værdi for MaxMetaspaceSize, ændrer Metaspace størrelsen på den ved kørsel i henhold til applikationskravet.
Når klassemetadataområdet når MaxMetaspaceSize, udløses Metaspace GC. Når der er overdreven Metaspace GC, angiver det hukommelseslækage af klasser, klasselæssere osv. Samt utilstrækkelig størrelse.
Affaldssamlingsalgoritmer i Java
Der er forskellige måder, hvorpå affaldssamlingen udføres. I dette afsnit præsenterer vi fire sådanne måder eller algoritmer til affaldssamling i Java.
Seriel GC
Seriel GC er den enkleste GC-algoritme. Det fungerer hovedsageligt på små dyngestørrelser og systemer med enkelt gevind. Mens du arbejder, fryser Serial GC alle applikationer.
For at aktivere Serial GC kan vi bruge følgende JVM-mulighed.
hvad er den bedste e-mail-server
java –xx:+UseSerialGC –jar Application.java
Ovenstående kommando kan gives i kommandolinjen. Her er Application.java en fil, som seriel GC skal aktiveres for.
Gennemstrømning / parallel GC
DEN Parallelle GC-algoritme er standard i JDK 8. Denne algoritme bruger flere tråde til at scanne bunkerummet og komprimeringen. Denne algoritme er mest egnet til applikationer, der kan håndtere trådpauser og optimere CPU-omkostningerne.
En ulempe ved parallel GC er, at algoritmen sætter applikationstrådene på pause under udførelse af mindre eller fuld GC.
CMS-samleren
CMS står for “ Samtidig Mark Sweep ”. Denne algoritme bruger flere samtidig tråde for at scanne bunken ( mærke ) for at identificere ubrugte objekter og genbruge ( feje ) dem. CMS-samleren har en tilstand Stop-The-World (STW).
Samleren går i denne tilstand i to scenarier:
- Når objekter, der tilhører den gamle generation, kan nås fra statiske variabler eller trådindgangspunkter. Så denne tilstand er aktiveret under initialiseringen af de første rodmarkeringer.
- Når algoritmen kører samtidigt, ændrer applikationen tilstanden og tvinger samleren til at gå tilbage for at sikre, at de korrekte objekter er markeret.
CMS-samleren kan dog lide under 'kampagnesvigt'. Så hvad er en salgsfremmende fiasko? Hvis objekterne fra det unge generationsrum flyttes til den gamle generation, og samleren ikke har skaffet nok plads til disse objekter i den gamle generations dyngerum, vil der opstå en reklamefejl.
For at forhindre reklamefejl kan vi give flere baggrundstråde til samleren eller give den gamle generation mere dyngestørrelse.
G1-samleren
G1 Collector er “Garbage-First” Collector. Det er designet til dyngestørrelser på mere end 4 GB. Baseret på dyngestørrelsen opdeler den dyngestørrelsen i regioner med størrelser fra 1 MB til 32 MB.
G1-samler markerer objekterne afhængigt af objekternes livlighed i hele bunken. Efter denne markeringsfase er G1 opmærksom på de tomme regioner. Således samler det de uopnåelige objekter fra disse regioner og frigør derved en stor mængde plads. Derfor er det navngivet som Garbage-First, da det først samler regioner, der indeholder affald.
Det opfylder også det brugerdefinerede pausetidsmål ved hjælp af en model for pauseforudsigelse ved at vælge antallet af regioner, der skal indsamles afhængigt af det angivne pausetidsmål.
Fordel ved affaldssamling
- Garbage Collection gør hukommelsesadministration i Java effektiv, da den fjerner ikke-henviste objekter fra bunkehukommelsen uden indblanding fra programmøren.
- Da affaldssamling er automatisk og er en del af JVM, er det ikke nødvendigt med ekstra indsats fra programmøren for at genvinde hukommelse eller ødelægge objekter.
- Programmøren behøver ikke skrive nogen specifik kode for at allokere hukommelsen og slette objekter som gjort i C / C ++.
Ofte stillede spørgsmål
Q # 1) Hvad er rollen som en affaldssamler?
Svar: I Java er Garbage Collector hovedparten i hukommelsesadministrationen og har til opgave at samle de uopnåelige objekter og genvinde hukommelsen.
Q # 2) Hvad mener du med Garbage Collection?
Svar: Affaldssamling er den teknik, hvormed hukommelse styres automatisk ved at genvinde den ubrugte hukommelse. Det er en funktion, der findes i programmeringssprog som Java, på grund af hvilket programmørerne ikke behøver at holde styr på de ubrugte objekter og ødelægge dem. Det gøres automatisk ved hjælp af affaldssamling.
Q # 3) Hvem er ansvarlig for affaldssamling i Java?
Svar: Hukommelsesadministration af Java har ansvaret for Garbage Collection.
Q # 4) Hvordan kan vi forhindre skraldindsamling i Java?
Svar: Da Garbage Collector ikke genvinder hukommelsen for variabler / objekter, der er i live, er den bedste måde at forhindre Garbage Collection på at fortsætte med at bruge variabler / objekter i hele programmet.
Q # 5) Hvordan kan du sikre dig, at en genstand indsamles affald?
Svar: Et objekt er kvalificeret til affaldssamling, når det ikke kan nås, dvs. når der ikke er flere referencer, der henviser til objektet. Selvom vi ikke kan tvinge Garbage Collector til at køre, når vi vil, kan vi altid bede den om at køre ved hjælp af System.gc ().
Konklusion
Garbage Collection i Java, som vi diskuterede i denne tutorial, er automatisk, og programmøren behøver ikke bekymre sig om at slette de objekter eller variabler, der er tildelt i programmet.
Automatisk affaldssamling i Java er sprogets vigtigste funktion og er en del af hukommelsesstyring i Java.
Selvom affaldssamling udføres af JVM og er uden for programmørens rækkevidde, kan vi altid anmode Garbage Collector om at køre ved hjælp af gc () -metoden i System- og Runtime-klassen.
I denne vejledning har vi diskuteret den færdiggørelsesproces, der udføres, før objekterne ødelægges af Garbage Collector. Vi har også diskuteret processen med Garbage Collection i Java. Endelig har vi diskuteret de forskellige algoritmer, der bruges af Garbage Collector.
Dette fuldender vores diskussion om Garbage Collector i Java.
=> Hold øje med den enkle Java-træningsserie her.
Anbefalet læsning
- Java Basics: Java Syntax, Java Class og Core Java Concepts
- Hvad bruges Java til: 12 virkelige verdens Java-applikationer
- Java String Tutorial | Java strengmetoder med eksempler
- JAVA-vejledning til begyndere: 100+ praktiske Java-videovejledninger
- Java-komponenter: Java Platform, JDK, JRE og Java Virtual Machine
- Java-implementering: Oprettelse og udførelse af Java JAR-fil
- Java Virtual Machine: Hvordan JVM hjælper med at køre Java-applikationer
- Java Reflection Tutorial med eksempler