CodeGym /Blog Jawa /Acak /Daur urip obyek
John Squirrels
tingkat
San Francisco

Daur urip obyek

Diterbitake ing grup
Hi! Aku mikir sampeyan ora bakal kaget banget yen aku ngandhani yen komputer sampeyan duwe memori sing winates :)
Siklus urip obyek - 1
Malah hard drive sampeyan (sing ukurane akeh, kaping pirang-pirang ukuran RAM) bisa kebak game favorit, acara TV, lan liya-liyane. Kanggo nyegah kedadeyan kasebut, sampeyan kudu ngawasi kahanan saiki ing memori komputer lan mbusak file sing ora perlu. Kepiye kabeh hubungane karo pemrograman Java? Langsung wae! Sawise kabeh, nggawe obyek apa wae nyebabake mesin Java nyedhiyakake memori kanggo kasebut . Program donya nyata gedhe nggawe puluhan utawa atusan ewu obyek, lan cuwilan memori diparengake kanggo saben wong. Nanging apa sampeyan mikir, carane akeh obyek iki ana? Apa dheweke "urip" sajrone program kita mlaku? Mesthi ora. Malah karo kabeh kaluwihan, obyek Jawa ora langgeng :) Obyek duwe siklus urip dhewe. Dina iki kita bakal njupuk break sethitik saka nulis kode lan njelajah proses iki :) Iku uga penting banget kanggo mangerteni carane program bisa lan kanggo ngatur sumber daya. Dadi, ing ngendi urip obyek diwiwiti? Kaya manungsa, wiwit lair, yaiku nalika diciptakake.

Cat cat = new Cat();// Our Cat object's lifecycle begins now!
Pisanan, mesin virtual Java nyedhiyakake memori sing dibutuhake kanggo nggawe obyek kasebut. Banjur nggawe referensi kanggo (ing kasus kita, cat) kanggo nggawe iku bisa kanggo nglacak. Banjur kabeh variabel diinisialisasi, konstruktor diarani, lan obyek seger saiki urip dhewe :) Umur obyek beda-beda. Ora ana angka sing tepat ing kene. Ing acara apa wae, obyek urip ing program lan nindakake fungsi kanggo sawetara wektu. Kanggo tepat, obyek kasebut "urip" anggere ana referensi. Sanalika ora ana referensi, obyek kasebut "mati". Tuladhane:

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;

   }

}
Ing main()metode kasebut, obyek Mobil "Lamborghini Diablo" mandheg urip ing baris kapindho. Mung ana siji referensi kanggo iku, lan referensi disetel kanggo null. Amarga ora ana referensi sing isih ana ing Diablo, mula dadi "sampah". Referensi ora kudu disetel menyang nol kanggo kedadeyan kasebut:

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 wis nggawe obyek liya lan menehi referensi menyang referensi lamborghini. Saiki rong referensi nuduhake Lamborghini Gallardoobyek kasebut, nanging Lamborghini Diabloobyek kasebut ora ana. Iki tegese Diabloobyek kasebut dadi sampah. Iki nalika pengumpul sampah (GC) dibangun ing Jawa .
Siklus urip obyek - 2
Pengumpul sampah minangka mekanisme internal Jawa sing tanggung jawab kanggo mbebasake memori, yaiku mbusak obyek sing ora perlu saka memori. Ana alesan kenapa kita milih kanggo makili karo robot vacuum cleaner. Penagih sampah kerjane kanthi cara sing padha: "ngobahake" program sampeyan ing latar mburi, ngumpulake sampah. Sampeyan praktis ora kudu sesambungan karo. Tugase yaiku mbusak obyek sing ora digunakake maneh ing program kasebut. Mangkono, mbebasake memori kanggo obyek liyane. Apa sampeyan ngelingi yen ing wiwitan pawulangan kita ngandika ing urip nyata sampeyan kudu ngawasi negara komputer lan mbusak file lawas? Yen kita ngomong babagan obyek Jawa, tukang sampah nindakake iki kanggo sampeyan. Penagih sampah diwiwiti kaping pirang-pirang nalika program sampeyan mlaku: sampeyan ora kudu nyebutake kanthi jelas lan menehi prentah (sanajan kanthi teknis bisa uga). Kita bakal ngomong luwih akeh babagan tukang sampah mengko lan nganalisa cara kerjane kanthi luwih rinci. Nalika pengumpul sampah tekan obyek - sadurunge dirusak - finalize()metode khusus obyek kasebut diarani. Cara iki bisa dijaluk kanggo ngeculake sumber daya tambahan tartamtu sing digunakake dening obyek kasebut. Metode kasebut finalize()kalebu kelas Object. Ing tembung liyane, iku padha karo equals(), hashCode()lan toString()(sing sadurunge wis ketemu). Saben obyek duwe . Iku beda karo cara liyane ing sing ... carane kudu ngomong iki ... iku banget willful. Miturut kita tegeseora mesthi diarani sadurunge obyek dirusak . Pemrograman minangka kegiatan sing tepat banget. Programmer ngandhani komputer kanggo nindakake apa wae, lan komputer nindakake. Aku nganggep sampeyan wis dadi rakulino kanggo Urut saka prilaku, supaya ing kawitan iku bisa dadi angel kanggo sampeyan nampa idea ing ngisor iki: "Sadurunge obyek wis numpes, metode kelas Obyek disebut. Utawa ora. finalize()Yen kita njaluk begja! " Isih, iki kasunyatan. Mesin Java dhewe nemtokake manawa kanggo nelpon finalize () ing cilik dening cilik. Minangka eksperimen, ayo nyoba nglakokake kode ing ngisor iki:

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!");
   }
}
Kita nggawe Catobyek, lan ing baris sabanjuré kita nul mung referensi kanggo. Lan kita nindakake sing yuta kaping. Kita wis ngilangi finalize()cara kasebut kanthi jelas. Saben Catobyek dirusak, kudu nampilake senar-total kaping siji yuta. Nanging ora! Mesthine, ing komputerku mung dieksekusi kaping 37346 ! Ing tembung liyane, mesin Java sandi mutusaké kanggo nelpon finalize()cara ing mung 1 saka saben 27 kasus. Ing kasus liyane, pengumpulan sampah ora kalebu telpon iki. Coba mbukak kode iki dhewe. Sampeyan bakal entuk asil sing beda. Kaya sing sampeyan ngerteni, angel nelpon finalize()mitra sing dipercaya :) Dadi, iki tip cilik kanggo masa depan: aja ngandelake metode finalize()kanggo ngeculake sumber daya kritis.JVM bisa uga nyebutake, utawa bisa uga ora. Sapa ngerti? Yen obyek sampeyan duwe sawetara sumber daya kritis kinerja (contone, sambungan database mbukak) nalika isih urip, luwih becik nggawe lan kanthi tegas nelpon cara khusus kanggo ngeculake nalika obyek kasebut ora dibutuhake maneh. Mangkono, sampeyan bakal ngerti manawa kinerja program sampeyan ora bakal nandhang sangsara. Kita miwiti kanthi ujar manawa nggarap memori lan koleksi sampah minangka topik sing penting banget, lan pancen bener. Mishandling sumber daya lan misunderstanding carane obyek rasah di resiki munggah bisa mimpin kanggo salah siji saka kewan omo sing paling ora nyenengake: memori bocor . Iki minangka salah sawijining kesalahan pemrograman sing paling misuwur. Malah duwe artikel Wikipedia dhewe. Kode sing ditulis kanthi ora apik bisa nggawe kahanan ing ngendi memori diparengake saben wektu kanggo obyek sing mentas digawe, nanging obyek lawas sing ora perlu ora kasedhiya kanggo koleksi sampah. Amarga kita wis nggawe analogi pembersih vakum robot, bayangake apa sing bakal kelakon yen sadurunge nglakokake robot sampeyan nyebar kaos kaki ing omah, mecah vas kaca, lan ninggalake potongan Lego ing lantai. Mesthine, robot kasebut bakal nyoba nindakake apa wae, nanging ing sawijining dina bakal entuk.
Daur urip obyek - 3
Kanggo nyedhot vakum bisa mlaku kanthi bener, sampeyan kudu njaga lantai kanthi apik lan njupuk kabeh sing ora bisa ditangani. Pengumpul sampah ngetutake prinsip sing padha. Yen program duwe akeh obyek sing ora bisa diresiki (kaya kaos kaki utawa Lego kanggo panyedhot vakum robot), sawijining dina kita bakal kehabisan memori. Ora mung program sampeyan bakal macet, kabeh program liyane sing mlaku ing komputer uga bakal. Sawise kabeh, dheweke uga ora duwe memori sing cukup (bali menyang analogi kita, kaca pecah ing lantai ora mung mandheg vakum, nanging uga wong sing manggon ing omah). Singkate, kaya iki minangka siklus urip obyek lan koleksi sampah ing Jawa. Sampeyan ora perlu apal iki: cukup mung ngerti cara kerjane. Ing wulangan sabanjure, kita bakal bali menyang proses kasebut kanthi luwih rinci. Nanging saiki, sampeyan bisa bali kanggo ngrampungake tugas CodeGym :) Good luck!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION