"Hej! Jeg besluttede at give dig endnu en lille lektion om affaldsindsamling."

Som du allerede ved, overvåger Java-maskinen selv, når et objekt bliver unødvendigt, og sletter det.

"Jep. Du og Rishi fortalte mig om det tidligere. Jeg kan ikke huske detaljerne."

"OK. Så lad os gå over det igen."

Affaldsopsamling - 1

"Så snart et objekt er oprettet, allokerer JVM'en hukommelse til det. Interessen for objektet overvåges ved hjælp af referencevariable.  Et objekt kan slettes under skraldindsamling, dvs. den procedure, hvorved hukommelse frigives, hvis der ikke er nogen variabler, der refererer til objektet. objekt. "

"Fortæl mig lidt om skraldesamleren - hvad det er, og hvordan det virker."

"OK. Garbage collection plejede at ske på hovedtråden. Hvert 5. minut eller oftere. Hvis der nogensinde ikke var nok ledig hukommelse, ville Java-maskinen suspendere alle tråde og slette ubrugte objekter."

"Men denne tilgang er blevet opgivet nu. Den næste generations skraldemand arbejder bag kulisserne og på en separat tråd. Dette kaldes samtidig affaldsindsamling."

"Jeg kan se. Hvordan er beslutningen om at slette et objekt eller ikke truffet?"

"Alene det at tælle antallet af referencer til et objekt er ikke særlig effektivt - der kan være objekter, der refererer til hinanden, men som ikke refereres af andre objekter."

"Så Java tager en anden tilgang.  Java opdeler objekter i tilgængelige og uopnåelige.  Et objekt er tilgængeligt (levende), hvis det refereres af et andet tilgængeligt (levende) objekt. Tilgængelighed bestemmes ud fra tråde. Løbende tråde anses altid for at kunne nås (levende) , selvom ingen henviser til dem."

"OK. Jeg tror, ​​jeg forstår det."

"Hvordan foregår den faktiske affaldsindsamling - sletning af unødvendige genstande?"

"Det er enkelt. I Java er hukommelsen opdelt i to dele efter konvention, og når det er tid til skraldindsamling, kopieres alle levende (tilgængelige) objekter til en anden del af hukommelsen, og den gamle hukommelse frigives alt sammen."

"Det er en interessant tilgang. Ingen grund til at tælle referencer: kopier alle de tilgængelige objekter, og alt andet er skrald."

"Det er lidt mere kompliceret end som så. Java-programmører fandt ud af, at objekter normalt er opdelt i to kategorier: langlivede (som eksisterer hele tiden, programmet kører) og kortlivede (som er nødvendige i metoder og til at udføre «lokale) » operationer)."

"Det er meget mere effektivt at holde genstande med lang levetid adskilt fra genstande med kort levetid. For at gøre dette var det nødvendigt at finde på en måde at bestemme genstandens levetid."

"Så de opdelte al hukommelse i «generationer». Der er førstegenerationsobjekter, andengenerationsobjekter osv. Hver gang hukommelsen ryddes, øges generationstælleren med 1. Hvis visse objekter eksisterer i flere generationer, så de er registreret som langlivede."

"I dag er skraldeopsamleren en meget kompleks og effektiv del af Java. Mange af dens dele fungerer heuristisk - baseret på algoritmer, der foretager gæt. Som et resultat "lytter den ofte ikke til" brugeren."

"Betyder?"

"Java har et garbage collector ( GC ) objekt, der kan kaldes ved hjælp af System.gc () metoden."

"Du kan også bruge System.runFinalization() til at tvinge kald til færdiggørelsesmetoderne for de objekter, der skal slettes. Men faktum er, at ifølge Java-dokumentationen, garanterer denne hverken, at affaldsindsamlingen starter, eller at færdiggørelsen( )-metoden vil blive kaldt.  Skraldesamleren bestemmer, hvornår den skal kaldes og på hvad. "

"Wow! Godt at vide."

"Men der er mere. Som du ved, i Java refererer nogle objekter til andre. Dette netværk af referencer bruges til at bestemme, om et objekt skal slettes."

"Og se. Java har specielle referencer, som lader dig påvirke denne proces. Der er specielle indpakningsklasser til dem. Her er de:"

" SoftReference  er en blød reference."

" WeakReference  er en svag reference."

" PhantomReference er en fantomreference."

"Øh... Dette minder mig om indre klasser, indlejrede klasser, indlejrede anonyme klasser og lokale klasser. Navnene er forskellige, men det er slet ikke klart, hvad de er til."

"Sig, Amigo, du er blevet programmør. Nu er du vred på grund af klassenavnene og siger "de er ikke informative nok, og det er umuligt med ét navn(!) at bestemme, hvad denne klasse gør, hvordan, og hvorfor"."

"Wow. Jeg lagde ikke engang mærke til det. Men det er så tydeligt."

"OK. Ord nok. Lad mig fortælle dig om SoftReferences."

"Disse referencer er specielt designet til caching, selvom de kan bruges til andre formål - alt efter programmørens skøn."

"Her er et eksempel på en sådan reference:"

Eksempel
// Create a Cat object
Cat cat = new Cat();

// Create a soft reference to a Cat object
SoftReference<Cat> catRef = new SoftReference<Cat>(cat);

// Now only the catRef soft reference points at the object
cat = null;

// Now the ordinary cat variable also references the object
cat = catRef.get();

// Clear the soft reference
catRef.clear();

"Hvis de eneste referencer til et objekt er bløde, så fortsætter det med at leve og kaldes 'softly-reachable'."

"Men!  Et objekt, der kun refereres af bløde referencer, kan slettes af skraldeopsamleren, hvis programmet ikke har nok hukommelse.  Hvis programmet pludselig ikke har nok hukommelse, vil skraldeopsamleren slette alle objekter, før du kaster en OutOfMemoryException . refereret af bløde referencer og vil prøve igen at allokere hukommelse til programmet."

"Antag, at et klientprogram ofte anmoder om forskellige data fra et serverprogram. Serverprogrammet kan bruge en SoftReference til at cache noget af det. Hvis objekter, der holdes fra døden af ​​bløde referencer, optager en stor del af hukommelsen, så sletter skraldemanden dem simpelthen alt sammen. Det er smukt!"

"Ja. Jeg kunne selv lide det."

"Nå, en lille tilføjelse: SoftReference- klassen har to metoder. Get()-metoden returnerer det objekt, der refereres til af SoftReference . Hvis objektet blev slettet af garbage collector, vil get ()-metoden pludselig begynde at returnere null."

"Brugeren kan også rydde SoftReference eksplicit ved at kalde clear() metoden. I dette tilfælde vil det svage link inde i SoftReference objektet blive ødelagt."

"Det er alt for nu."

"Tak for den interessante historie, Ellie. Det var virkelig meget interessant."