JavaRush /Blog Jawa /Random-JV /Siklus urip obyek

Siklus urip obyek

Diterbitake ing grup
Hello! Aku sampeyan ora bakal kaget banget yen kita pitutur marang kowe sing ukuran memori ing komputer diwatesi :) Malah hard drive, kang kaping pirang-pirang luwih gedhe tinimbang RAM, bisa kapenuhan kapasitas karo game favorit, serial TV, lan liya-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? Langsung! Sawise kabeh, nalika sembarang obyek digawe dening mesin Java, memori diparengake kanggo. Ing program gedhe nyata, puluhan lan atusan ewu obyek digawe, saben kang wis Piece dhewe saka memori diparengake. Siklus urip obyek - 1Nanging suwene sampeyan mikir kabeh obyek kasebut ana? Apa padha "urip" kabeh wektu program kita mlaku? Mesthi ora. Kanthi kabeh kaluwihan 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 ngerti operasi saka program lan ngatur sumber daya. Dadi, ing ngendi urip obyek diwiwiti? Kaya wong - wiwit lair, yaiku, nggawe.
Cat cat = new Cat();//вот сейчас и начался vital цикл нашего an object Cat!
Pisanan, Mesin Virtual Java nyedhiyakake jumlah memori sing dibutuhake kanggo nggawe obyek kasebut. Banjur dheweke nggawe link kasebut, ing kasus kita - catsupaya bisa nglacak. Sawise iki, kabeh variabel diinisialisasi, konstruktor diarani, lan lah, obyek seger kita wis urip dhewe :) Umur obyek beda-beda, ora ana nomer sing tepat ing kene. Ing kasus apa wae, sawetara wektu urip ing program kasebut lan nindakake fungsine. Kanggo tepat, obyek "urip" anggere ana referensi. Sanalika ora ana pranala, 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 cara, main()obyek mobil Lamborghini Diablo mandek kanggo urip wis ing baris kapindho. Mung ana siji link, lan saiki link iki wis diutus null. Amarga ora ana referensi kanggo Lamborghini Diablo, mula dadi "sampah". Ora perlu ngreset link:
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, sawise kita njupuk referensi lamborghinilan ditugasake kanggo obyek anyar iki. Saiki Lamborghini Gallardoana rong referensi sing nuding obyek kasebut, nanging Lamborghini Diabloora ana obyek kasebut. Mulane obyek kasebut Diablodadi sampah. Lan ing wektu iki, mekanisme Jawa dibangun ing disebut garbage collector, utawa ing tembung liyane - Garbage Collector, GC, wiwit operasi.
Siklus urip obyek - 2
Penagih sampah minangka mekanisme internal Jawa sing tanggung jawab kanggo mbebasake memori, yaiku, mbusak obyek sing ora perlu. Iku ora kanggo apa-apa sing kita milih gambar karo vacuum cleaner robot kanggo nggambarake. Sawise kabeh, tukang sampah bisa digunakake kanthi cara sing padha: ing latar mburi, "lelungan" liwat program sampeyan, ngumpulake sampah, lan ing wektu sing padha sampeyan ora bisa sesambungan. Tugase yaiku mbusak obyek sing ora digunakake maneh ing program kasebut. Mangkono, mbebasake memori ing komputer kanggo obyek liyane. Apa sampeyan ngelingi ing awal kuliah kita ujar manawa ing urip biasa sampeyan kudu ngawasi kahanan komputer lan mbusak file lawas? Dadi, ing kasus obyek Jawa, tukang sampah nindakake iki kanggo sampeyan. Pengumpul Sampah diluncurake kaping pirang-pirang sajrone operasi program sampeyan: ora perlu diarani khusus lan diwenehi perintah, sanajan iki bisa ditindakake kanthi teknis. Mengko kita bakal pirembagan liyane babagan lan njelasno proses karya ing liyane rinci. Ing wayahe nalika kolektor sampah tekan obyek kasebut, sadurunge karusakane, cara khusus diarani obyek - finalize(). Bisa digunakake kanggo mbebasake sawetara sumber daya tambahan sing digunakake obyek kasebut. Metode kasebut finalize()kalebu kelas Object. Sing, bebarengan karo equals(), hashCode()lan toString(), sing wis ketemu sadurungé, sembarang obyek duwe. Bedane karo cara liyane yaiku ... carane sijine ... banget capricious. Yaiku, ora mesthi diarani sadurunge ngrusak obyek. Pemrograman minangka bab sing tepat. Programmer ngandhani komputer kanggo nindakake apa wae, lan komputer nindakake. Sampeyan mbokmenawa wis digunakake kanggo prilaku iki, lan ing kawitan bisa angel kanggo sampeyan nampa idea: "Sadurunge obyek numpes, cara finalize()kelas diarani Object. Utawa ora diarani. Yen kita rejeki!" Nanging, iki bener. Mesin Java dhewe nemtokake manawa arep nelpon metode kasebut finalize()ing saben kasus tartamtu utawa ora. Contone, ayo nyoba mbukak kode ing ngisor iki kanggo 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;//вот здесь первый an object становится доступен сборщику мусора
       }
   }

   @Override
   protected void finalize() throws Throwable {
       System.out.println("Объект Cat уничтожен!");
   }
}
Kita nggawe obyek Catlan ing baris sabanjure kode ngreset mung referensi kanggo. Lan supaya - yuta kaping. We wis tegas overridden cara finalize(), lan kudu print senar kanggo console kaping yuta, saben wektu sadurunge numpes obyek Cat. Nanging ora! Kanggo tepat, mung mbukak 37.346 kaping ing komputerku! Yaiku, mung ing 1 kasus saka 27 mesin Java sing wis diinstal mutusake nelpon metode finalize()- ing kasus liyane, pengumpulan sampah ditindakake tanpa iki. Coba mbukak kode iki dhewe: paling kamungkinan, asil bakal beda. Nalika sampeyan bisa ndeleng, finalize()iku hard kanggo nelpon partner dipercaya :) Mulane, saran sethitik kanggo mangsa: sampeyan ora kudu gumantung ing cara finalize()ing kasus mbebasake sawetara sumber kritis. Mungkin JVM bakal nelpon, bisa uga ora. Sapa ngerti? Yen sajrone umur obyek sampeyan duwe sawetara sumber daya sing penting banget kanggo kinerja, umpamane, tetep mbukak sambungan menyang database, luwih becik nggawe metode khusus ing kelas sampeyan kanggo mbebasake lan nyebutake kanthi jelas nalika obyek kasebut ora perlu maneh. Kanthi cara iki sampeyan bakal ngerti manawa kinerja program sampeyan ora bakal nandhang sangsara. Ing awal banget kita ngandika sing Manajemen memori lan mbusak sampah penting banget, lan iki bener. Penanganan sumber daya sing ora cocog lan kurang pangerten babagan proses ngumpulake obyek sing ora perlu bisa nyebabake bocor memori. Iki minangka salah sawijining kesalahan pemrograman sing paling misuwur. Kode sing ditulis kanthi salah dening programer bisa nyebabake memori anyar dialokasikan saben wektu kanggo obyek sing mentas digawe, nalika obyek sing lawas lan ora perlu ora kasedhiya kanggo dibuwang dening kolektor sampah. Awit kita nggawe analogi karo robot vacuum cleaner, bayangake apa sing bakal kelakon yen, sadurunge miwiti robot, sampeyan nyebar kaos kaki ing omah, nyuwil vas kaca lan ninggalake set Lego sing disassembled ing lantai. Robot kasebut, mesthine bakal nyoba nindakake apa wae, nanging ing sawijining wektu bakal macet.
Siklus urip obyek - 3
Supaya bisa mlaku kanthi bener, sampeyan kudu njaga lantai kanthi apik lan mbusak kabeh sing ora bisa ditangani dening vakum. Pengumpul sampah makarya kanthi prinsip sing padha. Yen ana akeh obyek kiwa ing program sing ora bisa ngumpulake (kaya kaos kaki utawa Lego kanggo robot vakum luwih resik), ing siji wektu memori bakal entek. Lan ora mung program sing sampeyan tulis bakal beku, nanging uga kabeh program liyane sing mlaku ing komputer ing wektu kasebut. Ora bakal ana memori sing cukup kanggo dheweke. Iki minangka siklus urip obyek lan pengumpul sampah ing Jawa. Ora perlu ngeling-eling iki: mung ngerti prinsip operasi. Ing kuliah sabanjure kita bakal ngomong babagan proses kasebut kanthi luwih rinci, nanging saiki sampeyan bisa bali kanggo ngrampungake masalah JavaRush :) Good luck!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION