Hi!

Aku sampeyan ora bakal kaget banget yen aku pitutur marang kowe sing komputer wis jumlah winates saka memori :) Malah hard drive — umume kaping pirang-pirang luwih gedhe tinimbang panyimpenan RAM — bisa dikempalken kanggo kapasitas karo game favorit, acara TV, lan liyane. Kanggo nyegah kedadeyan kasebut, sampeyan kudu ngawasi kahanan memori saiki lan mbusak file sing ora perlu saka komputer. Apa hubungane pemrograman Java karo kabeh iki? Kabeh! Sawise kabeh, nalika mesin Java nggawe obyek apa wae, memori kasebut nyedhiyakake memori kanggo obyek kasebut.

Ing program gedhe nyata digawe puluhan lan atusan ewu obyek, lan saben wong wis Piece dhewe saka memori diparengake kanggo. Nanging suwene sampeyan mikir kabeh obyek kasebut ana? Apa dheweke "urip" kabeh wektu program kita mlaku? Mesthi ora. Malah karo kabeh kaluwihan saka obyek Jawa, padha ora langgeng :) Obyek duwe siklus urip dhewe. Dina iki kita bakal njupuk break sethitik saka nulis kode lan katon ing proses iki :) Menapa malih, iku penting banget kanggo pangerten carane program bisa lan carane sumber daya sing ngatur. Dadi, kapan urip obyek diwiwiti? Kaya wong - wiwit lair, yaiku, nggawe.


Cat cat = new Cat(); // Here the lifecycle of our Cat object begins!

Kaping pisanan, Mesin Virtual Java nyedhiyakake jumlah memori sing dibutuhake kanggo nggawe obyek kasebut. Banjur nggawe referensi kanggo memori kasebut. Ing kasus kita, referensi kasebut diarani cat, supaya kita bisa nglacak. Banjur kabeh variabel diinisialisasi, konstruktor diarani, lan - ta-da! - obyek sing mentas dicithak yaiku urip dhewe :)

Umur obyek beda-beda, mula kita ora bisa menehi nomer sing tepat ing kene. Ing kasus apa wae, urip sawetara wektu ing program kasebut lan nindakake fungsine. Kanggo tepat, obyek "urip" anggere ana referensi. Sanalika ora ana referensi sing isih ana, obyek kasebut "mati". Tuladha:


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;

   }

}

Obyek mobil Lamborghini Diablo mandheg urip ing baris kapindho metode kasebut main(). Mung ana siji referensi, banjur referensi kasebut disetel padha karo null. Amarga ora ana referensi sing isih ana ing Lamborghini Diablo, memori sing diparengake dadi "sampah". Referensi ora kudu disetel dadi null supaya bisa kedadeyan:


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;
   }

}

Ing kene kita nggawe obyek liya lan banjur menehi obyek anyar iki menyang lamborghinireferensi. Saiki Lamborghini Gallardoobyek kasebut duwe rong referensi, nanging Lamborghini Diabloobyek kasebut ora ana. Tegese Diabloobyek kasebut saiki dadi sampah. Iki nalika mekanisme dibangun ing Jawa disebut garbage collector (GC) teka menyang muter.

Pengumpul sampah minangka mekanisme internal Jawa sing tanggung jawab kanggo mbebasake memori, yaiku mbusak obyek sing ora perlu saka memori. Ana alesan sing apik kenapa kita milih gambar robot vacuum cleaner ing kene. Sawise kabeh, tukang sampah kerjane kanthi cara sing padha: ing latar mburi, "lelungan" babagan program sampeyan, ngumpulake sampah kanthi praktis ora ana gaweyan. Tugase yaiku mbusak obyek sing ora digunakake maneh ing program kasebut.

Mengkono iki mbebasake memori ing komputer kanggo obyek liyane. Apa sampeyan kelingan yen ing wiwitan pawulangan kita ujar manawa ing urip biasa sampeyan kudu ngawasi kahanan komputer lan mbusak file sing ora perlu? Inggih, ing kasus obyek Jawa, tukang sampah nindakake iki kanggo sampeyan. Penagih sampah mbukak bola-bali nalika program sampeyan mlaku: sampeyan ora kudu nyebut utawa menehi perintah kanthi jelas, sanajan kanthi teknis bisa. Mengko kita bakal ngrembug babagan iki lan nganalisis karyane kanthi luwih rinci.

Nalika kolektor sampah tekan obyek, sadurunge ngrusak obyek kasebut, diarani metode khusus - finalize()- ing obyek kasebut. Cara iki bisa ngeculake sumber daya liyane sing digunakake dening obyek kasebut. Metode kasebut finalize()minangka bagean saka Objectkelas. Tegese saliyane equals(), hashCode()lan toString()cara sing sampeyan temoni sadurunge, saben obyek duwe metode iki. Beda karo cara liya - kepiye carane aku kudu nggawe iki - banget capricious.

Utamane, ora tansah disebut sadurunge karusakan saka obyek. Pemrograman minangka upaya sing tepat. Programmer ngandhani komputer kanggo nindakake apa wae, lan komputer nindakake. Kayane sampeyan wis biasa karo prilaku iki, mula sampeyan bisa uga angel nampa gagasan ing ngisor iki: "Sadurunge ngrusak obyek, metode finalize()kelas kasebut Objectdiarani. Utawa bisa uga ora diarani. Iku kabeh gumantung rejekimu!"

Nanging, iku bener. Mesin Java dhewe nemtokake manawa arep nelpon finalize()cara kasebut kanthi basis cilik. Contone, ayo nyoba nglakokake kode ing ngisor iki minangka eksperimen:


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; // This is when the first object becomes available to the garbage collector
       }
   }

   @Override
   protected void finalize() throws Throwable {
       System.out.println("Cat object destroyed!");
   }
}

Kita nggawe Catobyek lan banjur ing baris sabanjuré kode kita nyetel mung referensi witjaksono kanggo null. Lan kita nindakake sing yuta kaping. We tegas overrode finalize()cara supaya print senar kanggo console kaping yuta (sapisan kanggo saben wektu numpes obyek Cat). Nanging ora! Kanggo tepat, mung 37.346 kaping ing komputerku! Yaiku, mung sapisan ing 27 kaping mesin Java sing diinstal ing mesinku mutusake nelpon finalize()metode kasebut.

Ing kasus liyane, pengumpulan sampah kedadeyan tanpa. Coba mbukak kode iki dhewe: paling kamungkinan, sampeyan bakal entuk asil sing beda. Kaya sing sampeyan ngerteni, finalize()meh ora bisa diarani mitra sing bisa dipercaya :) Dadi, saran sethithik kanggo masa depan: aja ngandelake metode finalize()kanggo mbebasake sumber daya kritis. Mungkin JVM bakal nelpon, utawa bisa uga ora. Sapa ngerti?

Yen obyek sampeyan isih urip, ana sawetara sumber daya sing penting banget kanggo kinerja, umpamane, sambungan database mbukak, luwih becik nggawe metode khusus ing kelas sampeyan kanggo ngeculake lan banjur nelpon kanthi jelas nalika obyek kasebut ora ana maneh. dibutuhake. Mangkono sampeyan bakal ngerti manawa kinerja program sampeyan ora bakal nandhang sangsara. Saka wiwitan, kita ngomong yen nggarap memori lan mbusak sampah iku penting banget, lan iki bener. Nangani sumber daya sing ora bener lan salah pangerten carane obyek sing ora perlu diresiki bisa nyebabake bocor memori. Iki minangka salah sawijining kesalahan pemrograman sing paling misuwur.

Yen programer salah nulis kode, memori anyar bisa diparengake kanggo obyek mentas digawe saben wektu, nalika lawas, obyek rasah ora kasedhiya kanggo dibusak dening kolektor uwuh. Awit kita nggawe analogi karo robot vacuum cleaner, bayangake apa sing bakal kelakon yen, sadurunge miwiti robot, sampeyan nyebar kaos kaki ing omah, ngrusak vas kaca, lan ninggalake blok bangunan Lego ing kabeh lantai. Robot bakal nyoba nindakake tugase, mesthine, nanging ing sawetara titik bakal macet.

Kanggo ngidini panyedot vakum robot bisa mlaku kanthi bener, sampeyan kudu njaga lantai kanthi apik lan mbusak apa wae sing ora bisa ditangani dening robot. Prinsip sing padha ditrapake kanggo tukang sampah Jawa. Yen ana akeh obyek sing isih ana ing program sing ora bisa di resiki (kayata kaos kaki utawa blok bangunan Lego kanggo panyedhot vakum robot kita), ing sawetara wektu sampeyan bakal kehabisan memori. Lan bisa uga ora mung program sampeyan sing bakal beku - kabeh program liyane sing mlaku ing komputer bisa uga kena pengaruh. Dheweke uga ora duwe memori sing cukup.

Sampeyan ora perlu apal iki. Sampeyan mung kudu ngerti prinsip ing mburi cara kerjane.