what is garbage collection java
Denne veiledningen forklarer hva som er søppelinnsamling i Java og hvordan fungerer søppelinnsamleren. Du vil også lære om Algorithms for Garbage Collection:
Leserne som er kunnskapsrike i C / C ++ må være klar over at det er programmererens ansvar å opprette og slette objektene i C / C ++.
Alvorlige feil oppstår hvis programmereren glemmer å ødelegge gjenstandene som er opprettet. Dette skyldes at unnlatelse av å ødelegge gjenstandene kan føre til at “ Tomt for minne ”Feil, minnelekkasjer osv.
Denne situasjonen er fullstendig ivaretatt i Java, da det ikke er behov for en programmerer å holde oversikt over objektene. Java tar seg av ødeleggelse av objekter for oss gjennom automatisk søppeloppsamling.
=> Besøk her for å lære Java fra bunnen av.
Prosessen der objektene som ikke lenger er i bruk, blir fjernet fra haugminnet kalles 'søppeloppsamling'. Søppeloppsamlingsteknikken er en del av minnestyring i Java.
Dermed i Java ødelegger Garbage Collector alle objektene som ikke er i bruk lenger.
Hva du vil lære:
- Hva er en søppeloppsamler i Java?
- Hvordan fungerer søppelinnsamling i Java?
- Søppelinnsamlingsalgoritmer i Java
- Konklusjon
Hva er en søppeloppsamler i Java?
Garbage Collection i Java styres av et program som heter Garbage Collector.
Garbage Collector kan defineres som et program som brukes til å administrere minne automatisk ved å håndtere objektets allokering.
Vi vet at på Java-språk blir de nye objektene opprettet og tildelt minne ved hjelp av den nye operatøren. Minnet som er tildelt et objekt ved hjelp av en ny operatør forblir allokert til referansene bruker dette objektet.
Så snart referansene slutter å eksistere, gjenvinnes minnet som objektet opptar. Java håndterer deretter de-allokering eller ødeleggelse av objekter automatisk, og vi trenger ikke eksplisitt å ødelegge objektet.
Denne teknikken er Garbage Collection-teknikken i Java der programmererne ikke trenger å håndtere deallocation av objekter eksplisitt.
Merk at hvis programmene ikke tildeler minne når objektene ikke trenger det, vil det til slutt ikke være noe minne igjen å tildele, og programmene vil krasje. Denne situasjonen kalles minnelekkasje.
Søppeloppsamleren løper alltid i bakgrunnen på en demonstråd. Garbage Collector regnes som det beste eksemplet på daemon-tråden.
Garbage Collector løper og har til hensikt å frigjøre haugeminnet. Det gjør dette ved å ødelegge objektene som er 'utilgjengelige'.
Hva er et 'utilgjengelig' objekt?
Et objekt blir utilgjengelig når det ikke engang er en eneste referanse knyttet til det.
Vurder 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 sett fra ovennevnte kode, er et objekt tilgjengelig så lenge en referanse er knyttet til det. I det øyeblikket referanseforeningen fjernes (en innstillingsreferanse til null i ovennevnte tilfelle) blir objektet utilgjengelig.
Når et objekt blir utilgjengelig, blir det kvalifisert for søppeloppsamling (GC).
Hvordan kan vi gjøre et objekt kvalifisert for GC?
Selv om programmereren ikke er pålagt å ødelegge objektene ettersom de blir tatt hånd om av GC, kan i det minste programmereren gjøre disse objektene utilgjengelige når de ikke lenger er påkrevd.
Ved å gjøre dette vil GC samle gjenstander som ikke kan nås og ødelegge dem.
Det er noen måter å gjøre et objekt kvalifisert for GC ved å gjøre det utilgjengelig.
De er:
# 1) Nullify The Reference
Gitt en referanse tildelt et objekt, hvis dette objektet ikke lenger er nødvendig, tilordne referansen til null.
Student s = new Student (); s = null;
Når s er satt til null, blir studentobjektet utilgjengelig.
# 2) Tilordne referansen på nytt
Dette er en annen måte å gjøre objektene kvalifiserte for GC.
Vurder følgende kode.
Student s1 = new Student (); Student s2 = new Student (); s1 = s2;
Nå som vi har tildelt s1 til et annet objekt, blir studentobjektet det refereres til av s1, referert til.
# 3) Opprett et anonymt objekt
Ved å opprette et anonymt objekt kan vi gjøre objektene kvalifiserte for GC.
Vi kan opprette et anonymt objekt som vist nedenfor:
new Student();
Når vi har gjort objektene kvalifiserte for GC, kan disse objektene ødelegges med en gang av GC. Dette er fordi vi ikke eksplisitt kan tvinge GC til å utføre når og når vi vil.
Når kjører søppeloppsamleren?
Det er opp til JVM å kjøre Garbage Collector-programmet. Når JVM kjører søppeloppsamleren, ødelegges de utilgjengelige gjenstandene. Men likevel kan vi ikke garantere når JVM vil kjøre.
Selv om vi ikke kan tvinge GC til å utføre, kan vi meget vel be om en søppelsamling.
GC kan be om ved hjelp av en av følgende metoder.
# 1) System.gc (): Systemklassen til Java gir en statisk metode gc () som vi kan be JVM om å kjøre Garbage Collector.
# 2) Runtime.getRuntime (). Gc (): I likhet med System.gc (), kan vi også bruke gc () -metoden i 'Runtime class' for å be JVM om å kjøre Garbage Collector.
Merk: Det er ingen garanti for at søppeloppsamleren vil kjøre etter en forespørsel fra disse to metodene.
Finalisering
Finalisering utføres av Garbage Collector like før du ødelegger gjenstandene. Som en del av finaliseringsteknikken kaller Garbage Collector finalize () -metoden på objektet. Finalize () -metoden brukes til å utføre oppryddingsaktiviteter.
Finalize () -metoden er levert av klassen “Object” og har følgende prototype.
protected void finalize () throws Throwable
Finalize () -metoden påberopes når gjenstanden blir samlet inn søppel
Merk: Søppeloppsamleren samler bare gjenstandene som er opprettet ved hjelp av det nye nøkkelordet. For andre objekter må vi bruke finalize () -metoden for å utføre oppryddingen.
Programmet nedenfor viser en enkel søppelsamling 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 } }
Produksjon
I programmet ovenfor har vi opprettet en klasse TestGC. I denne klassen har vi overstyrt finalize () -metoden. Så i hovedklassen lager vi to objekter av TestGC-klassen. Først nullstiller vi et objekt og ringer System.gc () for å be om søppeloppsamler.
Deretter opphever vi det andre objektet og anropsmetoden Runtime.getRuntime.gc () for å be om Garbage Collector. Utgangen viser den avsluttende metodeutgangen to ganger, og indikerer dermed at søppeloppsamleren kjørte to ganger.
Merk: Selv om vi har denne produksjonen, er det ikke garantert at vi får den samme effekten hver gang. Det kommer helt an på JVM.
Hvordan fungerer søppelinnsamling i Java?
I denne delen vil vi se hvordan Garbage Collection fungerer i Java.
Under søppeloppsamlingen, ser søppeloppsamleren opp Heap-minnet og 'merker' deretter gjenstandene som ikke kan nås. Da ødelegger det dem.
Men problemet oppstår når antall objekter øker. Når objektene øker, øker også tiden det tar for søppeloppsamling ettersom det ser etter gjenstander som ikke kan nås. Det påvirker imidlertid ikke for mye, ettersom de fleste gjenstander har kort levetid.
Oppførselen ovenfor kalles “Generational Garbage Collection” og skal forbedre JVM-ytelsen. I denne tilnærmingen er hele haugrommet delt inn i - Young Generation, Old or Tenured Generation og Permanent Generation.
# 1) Unge generasjons dyngerom: Alle de nye objektene er opprettet i dette rommet. Når plassen er full finner Minor GC sted der alle de døde gjenstandene blir ødelagt. Den mindre GC-prosessen er rask og rask ettersom de fleste gjenstander er døde. Objektene som overlever den unge generasjonen flyttes til de eldre generasjonene.
# 2) Gammel generasjons haugplass: Denne generasjonen lagrer gjenstander som overlever lenge. Når terskelalderen som er satt for den unge generasjonen er oppfylt, flyttes objektet til den gamle generasjonen. Når den gamle generasjonsplassen er fylt utføres en Major GC.
Major GC er treg da gjenstander som er involvert her er levende gjenstander. Noen ganger blir hele haugeplassen som inkluderer unge, så vel som gamle generasjoner, ryddet. Dette kalles “Full GC”.
# 3) Permanent generasjonL Inntil Java 7 pleide det å være en Permanent Generasjon (Perm Gen). Perm Gen-metadata ble brukt av JVM. JVM brukte denne metadata for å beskrive klasser og metoder som ble brukt i applikasjonen. Perm Gen ble fjernet i Java 8.
Java 8 Garbage Collection: Perm Gen And Metaspace
Vi har allerede nevnt om Perm Gen plass som var tilstede til Java 7. Imidlertid representerer JVM nå Java Java klassemetadataene ved hjelp av det opprinnelige minnet kalt “Metaspace”.
Bortsett fra Metaspace, er det et nytt flagg kalt “MaxMetaspaceSize” som begrenser minnet som brukes til klassemetadata. Hvis ingen verdi er spesifisert for MaxMetaspaceSize, endrer Metaspace størrelsen på den i løpet av applikasjonskravet.
Når klassens metadataområde når MaxMetaspaceSize, utløses Metaspace GC. Når det er overdreven Metaspace GC, indikerer det minnelekkasje av klasser, klasselastere osv., Samt utilstrekkelig størrelse.
Søppelinnsamlingsalgoritmer i Java
Det er forskjellige måter Garbage Collection utføres på. I denne delen vil vi presentere fire slike måter eller algoritmer for søppelinnsamling i Java.
Seriell GC
Seriell GC er den enkleste GC-algoritmen. Det fungerer hovedsakelig på små haugstørrelser og enkeltrådede systemer. Mens du arbeider, fryser Serial GC alle applikasjonene.
For å slå på Serial GC, kan vi bruke følgende JVM-alternativ.
c ++ funksjon for sortering av boble
java –xx:+UseSerialGC –jar Application.java
Ovennevnte kommando kan gis i kommandolinjen. Her er Application.java en fil som seriell GC skal aktiveres for.
Gjennomstrømning / parallell GC
DEN Parallelle GC-algoritmen er standard i JDK 8. Denne algoritmen bruker flere tråder til å skanne bunkerommet og komprimering. Denne algoritmen passer hovedsakelig for applikasjoner som kan håndtere trådpauser og optimalisere CPU-overhead.
En ulempe med parallell GC er at algoritmen stopper applikasjonstrådene mens du utfører mindre eller full GC.
CMS Collector
CMS står for “ Samtidig Mark Sweep ”. Denne algoritmen bruker flere samtidig tråder for å skanne haugen ( merke ) for å identifisere ubrukte gjenstander og resirkulere ( feie ) dem. CMS-samleren har en modus Stop-The-World (STW).
Samleren går i denne modusen i to scenarier:
- Når objekter som tilhører den gamle generasjonen kan nås fra statiske variabler eller trådinngangspunkter. Så denne modusen er på under initialiseringen av de første rotmarkeringene.
- Når algoritmen kjører samtidig, endrer applikasjonen tilstanden og tvinger samleren til å gå tilbake for å sikre at de riktige objektene er merket.
CMS-samleren kan imidlertid lide av 'kampanjefeil'. Så hva er en markedsføringssvikt? Hvis objektene fra det unge generasjonsrommet flyttes til den gamle generasjonen, og samleren ikke har gjort nok plass til disse objektene i den gamle generasjons dyngerom, vil det oppstå en markedsføringsfeil.
For å forhindre kampanjesvikt, kan vi gi flere bakgrunnstråder til samleren eller gi mer dyngestørrelse til den gamle generasjonen.
G1 Collector
G1 Collector er 'Garbage-First' Collector. Den er designet for haugestørrelser på mer enn 4 GB. Basert på dyngestørrelsen, deler den dyngestørrelsen i regioner med størrelser fra 1 MB til 32 MB.
G1-samler merker gjenstandene avhengig av livligheten til gjenstandene gjennom haugen. Etter denne merkingsfasen er G1 klar over de tomme områdene. Dermed samler den oppnåelige gjenstander fra disse områdene og frigjør dermed en stor mengde plass. Derfor blir den kalt Garbage-First da den samler inn regioner som inneholder søppel først.
Den oppfyller også det brukerdefinerte pausetidsmålet ved å bruke en prediksjonsmodell for pause ved å velge antall regioner som skal samles, avhengig av det angitte pausetidsmålet.
Fordelen med søppelinnsamling
- Garbage Collection gjør minnestyring i Java effektiv da den fjerner ikke-refererte objekter fra heapminnet uten forstyrrelse fra programmereren.
- Siden søppelinnsamling er automatisk og er en del av JVM, er det ikke behov for ekstra innsats fra programmereren for å gjenvinne minne eller ødelegge objekter.
- Programmereren trenger ikke skrive noen spesifikk kode for å allokere minnet og slette objekter som gjort i C / C ++.
ofte stilte spørsmål
Q # 1) Hva er rollen til en søppeloppsamler?
Svar: I Java er Garbage Collector hovedparten i minneadministrasjonen, og har til oppgave å samle opp objektene som ikke kan nås og gjenvinne minnet.
Q # 2) Hva mener du med søppelinnsamling?
Svar: Søppelinnsamling er teknikken som minne styres automatisk ved å gjenvinne ubrukt minne. Det er en funksjon som er tilstede i programmeringsspråk som Java, som programmererne ikke trenger å holde rede på ubrukte objekter og ødelegge dem. Det gjøres automatisk ved hjelp av søppelinnsamling.
Q # 3) Hvem er ansvarlig for søppelinnsamling på Java?
Svar: Minnehåndtering av Java har ansvaret for søppelinnsamling.
Q # 4) Hvordan kan vi forhindre søppelinnsamling på Java?
Svar: Siden Garbage Collector ikke gjenvinner minnet til variabler / objekter som er i live, er den beste måten å forhindre søppelinnsamling på å fortsette å bruke variabler / objekter gjennom hele programmet.
Q # 5) Hvordan kan du sørge for at en gjenstand blir søppel?
Svar: Et objekt er kvalifisert for søppelinnsamling når det ikke kan nås, dvs. når ingen flere referanser refererer til objektet. Selv om vi ikke kan tvinge søppeloppsamleren til å kjøre når vi vil, kan vi alltid be den om å kjøre ved hjelp av System.gc ().
Konklusjon
Søppelsamlingen i Java som vi diskuterte i denne opplæringen er automatisk, og programmereren trenger ikke bekymre seg for å slette objektene eller variablene som er tildelt i programmet.
Automatic Garbage Collection in Java er den viktigste funksjonen i språket og er en del av minnestyring i Java.
Selv om søppeloppsamling utføres av JVM og er utenfor programmørens rekkevidde, kan vi alltid be søppeloppsamleren om å kjøre ved hjelp av gc () -metoden i klassen System og Runtime.
I denne veiledningen har vi diskutert sluttprosessen som utføres før gjenstandene blir ødelagt av søppeloppsamleren. Vi har også diskutert prosessen med Garbage Collection i Java. Til slutt har vi diskutert de forskjellige algoritmene som brukes av Garbage Collector.
Dette fullfører vår diskusjon om Garbage Collector i Java.
=> Se opp den enkle Java-treningsserien her.
Anbefalt lesing
- Java Basics: Java Syntax, Java Class og Core Java Concepts
- Hva brukes Java til: 12 virkelige verdens Java-applikasjoner
- Java String Tutorial | Java strengmetoder med eksempler
- JAVA-opplæring for nybegynnere: 100+ praktiske Java-videoveiledninger
- Java-komponenter: Java-plattform, JDK, JRE og Java Virtual Machine
- Java-distribusjon: Opprettelse og utføring av Java JAR-fil
- Java Virtual Machine: Hvordan JVM hjelper med å kjøre Java-applikasjoner
- Java Reflection Tutorial med eksempler