Hej! Jag tror att du inte skulle bli sÀrskilt förvÄnad om jag berÀttade att din dator har en begrÀnsad mÀngd minne :)
Till och med din hĂ„rddisk (som Ă€r mĂ„nga, mĂ„nga gĂ„nger sĂ„ stor som RAM) kan bli fullproppad med dina favoritspel, TV-program och andra saker. För att förhindra att detta hĂ€nder mĂ„ste du övervaka det aktuella tillstĂ„ndet i din dators minne och radera onödiga filer. Hur hĂ€nger allt detta ihop med Java-programmering? Ganska direkt! NĂ€r allt kommer omkring gör att skapa ett objekt gör att Java-maskinen allokerar minne för det . Ett stort verkligt program skapar tiotals eller hundratusentals objekt, och en bit minne tilldelas för vart och ett av dem. Men vad tror du, hur mĂ„nga av dessa föremĂ„l finns det? Ăr de "levande" hela tiden vĂ„rt program körs? SjĂ€lvklart inte. Ăven med alla sina fördelar Ă€r Java-objekt inte odödliga :) Objekt har sin egen livscykel. Idag tar vi en liten paus frĂ„n att skriva kod och utforskar denna process :) Det Ă€r ocksĂ„ mycket viktigt för att förstĂ„ hur ett program fungerar och för att hantera resurser. SĂ„, var börjar ett objekts liv? Som en mĂ€nniska, frĂ„n födseln, alltsĂ„ nĂ€r den skapas.
SkrĂ€psamlaren Ă€r en intern Java-mekanism som ansvarar för att frigöra minne, det vill sĂ€ga att ta bort onödiga föremĂ„l frĂ„n minnet. Det finns en anledning till att vi valde att representera det med en robotdammsugare. SophĂ€mtaren fungerar pĂ„ ungefĂ€r samma sĂ€tt: den "rör sig" i ditt program i bakgrunden och samlar skrĂ€p. Du behöver praktiskt taget inte interagera med den. Dess uppgift Ă€r att ta bort objekt som inte lĂ€ngre anvĂ€nds i programmet. SĂ„ledes frigör det minne för andra objekt. Kommer du ihĂ„g att du i början av lektionen sa i verkligheten mĂ„ste övervaka din dators tillstĂ„nd och radera gamla filer? Om vi ââpratar om Java-objekt, gör sopsamlaren detta Ă„t dig. SkrĂ€psamlaren startas mĂ„nga gĂ„nger nĂ€r ditt program körs: du behöver inte uttryckligen kalla det och ge det kommandon (Ă€ven om detta Ă€r tekniskt möjligt). Vi kommer att prata mer om sophĂ€mtaren senare och analysera hur den fungerar mer i detalj. NĂ€r sopsamlaren nĂ„r ett föremĂ„l â precis innan det förstörs â
För att dammsugaren ska fungera som den ska mÄste du hÄlla golvet i hyfsad form och plocka upp allt som den inte klarar av. Sopsamlaren följer samma princip. Om ett program har mÄnga föremÄl som det inte kan stÀda upp (som en strumpa eller lego till vÄr robotdammsugare), kommer vi en dag att fÄ slut pÄ minne. Inte bara kommer ditt program att hÀnga sig, alla andra program som rÄkar köras pÄ datorn kommer ocksÄ att göra det. NÀr allt kommer omkring kommer de inte att ha tillrÀckligt med minne heller (om vi ÄtergÄr till vÄr analogi, det krossade glaset pÄ golvet stoppar inte bara dammsugaren, utan ocksÄ mÀnniskorna som bor i hemmet). Kort sagt, sÄ hÀr ser objekts livscykel och sophÀmtning ut i Java. Du behöver inte memorera detta: det rÀcker att bara förstÄ hur det fungerar. I nÀsta lektion, vi Äterkommer till dessa processer mer i detalj. Men för nu kan du ÄtergÄ till att lösa CodeGym-uppgifter :) Lycka till!
![Objektets livscykel - 1](https://cdn.codegym.cc/images/article/d5d024c8-7d15-4831-951d-a1a5a83551be/512.jpeg)
Cat cat = new Cat();// Our Cat object's lifecycle begins now!
Först allokerar den virtuella Java-maskinen det minne som krÀvs för att skapa objektet. Sedan skapar den en referens till den (i vÄrt fall, cat
) för att göra det möjligt att hÄlla reda pÄ det. Sedan initieras alla variabler, konstruktorn anropas och vÄrt nya objekt lever nu sitt eget liv :) Objektets livslÀngder varierar. Det finns inga exakta siffror hÀr. I alla hÀndelser lever ett objekt i programmet och utför sina funktioner under en viss tidsperiod. För att vara exakt sÄ Àr föremÄlet "levande" sÄ lÀnge det finns referenser till det. SÄ fort det inte finns nÄgra referenser "dör objektet". Till exempel:
public class Car {
String model;
public Car(String model) {
this.model = model;
}
public static void main(String[] args) {
Car lamborghini = new Car("Lamborghini Diablo");
lamborghini = null;
}
}
I main()
metoden upphör objektet "Lamborghini Diablo" Car att vara vid liv pÄ andra raden. Det fanns bara en referens till den, och referensen var instÀlld pÄ null. Eftersom det inte finns nÄgra kvarvarande referenser till Diablo blir det "skrÀp". En referens behöver inte vara noll för att detta ska hÀnda:
public class Car {
String model;
public Car(String model) {
this.model = model;
}
public static void main(String[] args) {
Car lamborghini = new Car("Lamborghini Diablo");
Car lamborghiniGallardo = new Car("Lamborghini Gallardo");
lamborghini = lamborghiniGallardo;
}
}
HÀr har vi skapat ett andra objekt och tilldelat det till lamborghini-referensen. Nu pekar tvÄ referenser till Lamborghini Gallardo
objektet, men Lamborghini Diablo
objektet har ingen. Detta innebÀr att Diablo
föremÄlet blir skrÀp. Det Àr dÄ Javas inbyggda garbage collector (GC) slÄr in.
![Objektets livscykel - 2](https://cdn.codegym.cc/images/article/70dba04f-3fd9-4be9-89ec-c5d000c26165/512.jpeg)
finalize()
kallas föremÄlets speciella metod. Denna metod kan anropas för att frigöra vissa ytterligare resurser som anvÀnds av objektet. Metoden finalize()
tillhör klassen Object. Med andra ord, det liknar equals()
, hashCode()
och toString()
(som du tidigare har trÀffat). Varje föremÄl har det . Det skiljer sig frÄn andra metoder genom att...hur ska vi sÀga detta...det Àr vÀldigt medvetet. Med det menar vi detdet anropas inte alltid innan ett föremÄl förstörs . Programmering Àr en mycket exakt aktivitet. Programmeraren sÀger Ät datorn att göra nÄgot, och datorn gör det. finalize()
Jag antar att du har blivit van vid den hĂ€r typen av beteende, sĂ„ till en början kan det vara svĂ„rt för dig att acceptera följande idĂ©: "Innan ett objekt förstörs , kallas Object-klassens metod. Eller inte. Om vi ââhar tur! " ĂndĂ„ Ă€r detta verkligheten. Java-maskinen avgör sjĂ€lv om finalize() ska anropas frĂ„n fall till fall. Som ett experiment, lĂ„t oss försöka köra följande kod:
public class Cat {
private String name;
public Cat(String name) {
this.name = name;
}
public Cat() {
}
public static void main(String[] args) throws Throwable {
for (int i = 0 ; i < 1000000; i++) {
Cat cat = new Cat();
cat = null;// The first object becomes available for garbage collection here
}
}
@Override
protected void finalize() throws Throwable {
System.out.println("The Cat is destroyed!");
}
}
Vi skapar ett Cat
objekt och pÄ nÀsta rad nollstÀller vi den enda referensen till det. Och det gör vi en miljon gÄnger. Vi har uttryckligen Äsidosatt finalize()
metoden. Varje gÄng ett Cat
objekt förstörs mĂ„ste det visa en strĂ€ng â totalt en miljon gĂ„nger. Men nej! För att vara exakt, pĂ„ min dator kördes det bara 37346 gĂ„nger! Med andra ord, min Java-maskin bestĂ€mde sig för att anropa finalize()
metoden i endast 1 av 27 fall. I de andra fallen omfattade inte sophÀmtning detta samtal. Testa att köra den hÀr koden sjÀlv. Du kommer med största sannolikhet att fÄ ett annat resultat. Som du kan se Àr det svÄrt att kalla finalize()
en pÄlitlig partner :) SÄ hÀr Àr ett litet tips för framtiden: lita inte pÄ metoden finalize()
för att frigöra kritiska resurser.JVM kan kalla det, eller sÄ kanske det inte. Vem vet? Om ditt objekt hade nÄgra prestandakritiska resurser (till exempel en öppen databasanslutning) medan det levde, skulle det vara bÀttre att skapa och uttryckligen anropa en speciell metod för att frigöra dem nÀr objektet inte lÀngre behövs. PÄ sÄ sÀtt vet du sÀkert att ditt programs prestanda inte blir lidande. Vi började med att sÀga att arbetet med minne och sophÀmtning Àr vÀldigt viktiga Àmnen, och det Àr de verkligen. Felhantering av resurser och missförstÄnd av hur onödiga föremÄl rensas upp kan leda till en av de mest obehagliga buggarna: minneslÀckor . Detta Àr ett av de mest kÀnda programmeringsfelen. Den har till och med en egen Wikipedia- artikel. DÄligt skriven kod kan skapa en situation dÀr minne tilldelas varje gÄng för nyskapade objekt, men gamla, onödiga objekt Àr otillgÀngliga för sophÀmtning. Eftersom vi redan har gjort en robotdammsugaranalogi, förestÀll dig vad som skulle hÀnda om du innan du körde roboten spred strumpor över hela huset, krossade en glasvas och lÀmnade legobitar över hela golvet. Naturligtvis skulle roboten försöka göra nÄgot, men en dag kommer den att gripa tag.
![Objektets livscykel - 3](https://cdn.codegym.cc/images/article/b222972f-f516-4cf8-9d7e-984b7f3f2b6e/512.jpeg)
GO TO FULL VERSION