CodeGym /Java Blog /Acak /Siklus hidup objek
John Squirrels
Level 41
San Francisco

Siklus hidup objek

Dipublikasikan di grup Acak
Hai! Saya pikir Anda tidak akan terkejut jika saya memberi tahu Anda bahwa komputer Anda memiliki jumlah memori yang terbatas :)
Daur hidup objek - 1
Bahkan hard drive Anda (yang ukurannya berkali-kali lipat dari RAM) dapat penuh dengan game favorit Anda, acara TV, dan hal lainnya. Untuk mencegah hal ini terjadi, Anda perlu memantau kondisi memori komputer Anda saat ini dan menghapus file yang tidak perlu. Bagaimana semua ini berhubungan dengan pemrograman Java? Cukup langsung! Lagi pula, membuat objek apa pun menyebabkan mesin Java mengalokasikan memori untuknya . Program dunia nyata yang besar membuat puluhan atau ratusan ribu objek, dan sebagian memori dialokasikan untuk masing-masing objek. Tapi bagaimana menurut Anda, berapa banyak dari benda-benda ini yang ada? Apakah mereka "hidup" selama program kita berjalan? Tentu saja tidak. Bahkan dengan segala kelebihannya, objek Java tidak abadi :) Objek memiliki siklus hidupnya sendiri. Hari ini kita akan beristirahat sejenak dari menulis kode dan menjelajahi proses ini :) Ini juga sangat penting untuk memahami cara kerja program dan untuk mengelola sumber daya. Jadi, dari mana kehidupan suatu objek dimulai? Ibarat manusia, sejak lahir, yaitu saat diciptakan.

Cat cat = new Cat();// Our Cat object's lifecycle begins now!
Pertama, mesin virtual Java mengalokasikan memori yang diperlukan untuk membuat objek. Kemudian itu membuat referensi untuk itu (dalam kasus kami, cat) untuk memungkinkan untuk melacaknya. Kemudian semua variabel diinisialisasi, konstruktor dipanggil, dan objek baru kita sekarang menjalani hidupnya sendiri :) Masa pakai objek berbeda-beda. Tidak ada angka pasti di sini. Bagaimanapun, sebuah objek hidup dalam program dan menjalankan fungsinya untuk beberapa periode waktu. Tepatnya, objek itu "hidup" selama ada referensi untuk itu. Segera setelah tidak ada referensi, objek tersebut "mati". Misalnya:

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;

   }

}
Dalam main()metodenya, objek Mobil "Lamborghini Diablo" berhenti hidup di baris kedua. Hanya ada satu referensi untuk itu, dan referensi disetel ke nol. Karena tidak ada referensi yang tersisa untuk Diablo, itu menjadi "sampah". Referensi tidak harus disetel ke nol agar hal ini terjadi:

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

}
Di sini kita telah membuat objek kedua dan menugaskannya ke referensi lamborghini. Sekarang dua referensi menunjuk ke Lamborghini Gallardoobjek, tetapi Lamborghini Diabloobjek tidak memilikinya. Ini berarti Diabloobjek menjadi sampah. Ini adalah saat pengumpul sampah (GC) bawaan Java mulai bekerja.
Daur hidup objek - 2
Pengumpul sampah adalah mekanisme internal Java yang bertanggung jawab untuk mengosongkan memori, yaitu menghapus objek yang tidak perlu dari memori. Ada alasan mengapa kami memilih untuk merepresentasikannya dengan robot penyedot debu. Pengumpul sampah bekerja dengan cara yang hampir sama: ini "bergerak" program Anda di latar belakang, mengumpulkan sampah. Anda praktis tidak perlu berinteraksi dengannya. Tugasnya adalah menghapus objek yang tidak lagi digunakan dalam program. Dengan demikian, ini membebaskan memori untuk objek lain. Apakah Anda ingat di awal pelajaran yang kami katakan dalam kehidupan nyata Anda harus memantau kondisi komputer Anda dan menghapus file lama? Jika kita berbicara tentang objek Java, pengumpul sampah melakukan ini untuk Anda. Pengumpul sampah dimulai berkali-kali saat program Anda berjalan: Anda tidak perlu memanggilnya secara eksplisit dan memberinya perintah (meskipun secara teknis hal ini dimungkinkan). Kami akan berbicara lebih banyak tentang pengumpul sampah nanti dan menganalisis cara kerjanya lebih detail. Saat pengumpul sampah mencapai objek—tepat sebelum dihancurkan— finalize()metode khusus objek dipanggil. Metode ini dapat dipanggil untuk melepaskan sumber daya tambahan tertentu yang digunakan oleh objek. Metode finalize()milik kelas Objek. Dengan kata lain, ini mirip dengan equals(), hashCode()dan toString()(yang pernah Anda temui sebelumnya). Setiap objek memilikinya . Ini berbeda dari metode lain dalam...bagaimana kita harus mengatakan ini...itu sangat disengaja. Maksud kami ituitu tidak selalu dipanggil sebelum objek dihancurkan . Pemrograman adalah kegiatan yang sangat tepat. Pemrogram memberi tahu komputer untuk melakukan sesuatu, dan komputer melakukannya. Saya menganggap Anda sudah terbiasa dengan perilaku semacam ini, jadi pada awalnya mungkin sulit bagi Anda untuk menerima ide berikut: "Sebelum sebuah objek dihancurkan, metode kelas Object dipanggil. Atau tidak. finalize()Jika kita beruntung! " Namun, ini adalah kenyataan. Mesin Java itu sendiri menentukan apakah akan memanggil finalize() berdasarkan kasus per kasus. Sebagai percobaan, mari coba jalankan kode berikut:

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!");
   }
}
Kami membuat Catobjek, dan di baris berikutnya kami membidik satu-satunya referensi untuk itu. Dan kami melakukannya jutaan kali. Kami telah mengganti finalize()metode secara eksplisit. Setiap kali sebuah Catobjek dihancurkan, ia harus menampilkan sebuah string—total satu juta kali. Tapi tidak! Tepatnya, di komputer saya hanya dieksekusi 37346 kali! Dengan kata lain, mesin Java saya memutuskan untuk memanggil finalize()metode hanya dalam 1 dari setiap 27 kasus. Dalam kasus lain, pengumpulan sampah tidak melibatkan panggilan ini. Coba jalankan kode ini sendiri. Kemungkinan besar Anda akan mendapatkan hasil yang berbeda. Seperti yang Anda lihat, sulit untuk memanggil finalize()mitra yang andal :) Jadi, inilah tip kecil untuk masa depan: jangan mengandalkan metode finalize()untuk melepaskan sumber daya penting.JVM mungkin menyebutnya, atau mungkin juga tidak. Siapa tahu? Jika objek Anda memiliki beberapa sumber daya yang kritis terhadap kinerja (misalnya, koneksi database terbuka) saat masih hidup, akan lebih baik untuk membuat dan secara eksplisit memanggil metode khusus untuk melepaskannya saat objek tidak lagi diperlukan. Dengan begitu, Anda akan tahu pasti bahwa kinerja program Anda tidak akan menurun. Kami mulai dengan mengatakan bahwa bekerja dengan memori dan pengumpulan sampah adalah topik yang sangat penting, dan memang demikian. Kesalahan penanganan sumber daya dan kesalahpahaman bagaimana objek yang tidak perlu dibersihkan dapat menyebabkan salah satu bug yang paling tidak menyenangkan: kebocoran memori . Ini adalah salah satu kesalahan pemrograman yang paling terkenal. Ia bahkan memiliki artikel Wikipedia sendiri. Kode yang ditulis dengan buruk dapat menciptakan situasi di mana memori dialokasikan setiap saat untuk objek yang baru dibuat, tetapi objek lama yang tidak perlu tidak tersedia untuk pengumpulan sampah. Karena kita telah membuat analogi penyedot debu robot, bayangkan apa yang terjadi jika sebelum menjalankan robot Anda menyebarkan kaus kaki ke seluruh rumah, memecahkan vas kaca, dan meninggalkan potongan Lego di lantai. Secara alami, robot akan mencoba melakukan sesuatu, tetapi suatu hari robot itu akan menangkapnya.
Daur hidup objek - 3
Agar penyedot debu berfungsi dengan baik, Anda harus menjaga lantai dalam kondisi yang layak dan mengambil semua yang tidak dapat ditanganinya. Pengumpul sampah mengikuti prinsip yang sama. Jika suatu program memiliki banyak objek yang tidak dapat dibersihkan (seperti kaus kaki atau Lego untuk penyedot debu robotik kita), suatu hari kita akan kehabisan memori. Tidak hanya program Anda yang akan hang, semua program lain yang kebetulan berjalan di komputer juga akan hang. Lagipula, mereka juga tidak akan memiliki cukup memori (kembali ke analogi kita, pecahan kaca di lantai tidak hanya menghentikan penyedot debu, tetapi juga orang yang tinggal di rumah). Singkatnya, seperti inilah siklus hidup objek dan pengumpulan sampah di Jawa. Anda tidak perlu menghafalnya: cukup memahami cara kerjanya saja. Pada pelajaran selanjutnya, kita akan kembali ke proses ini secara lebih rinci. Namun untuk saat ini, Anda dapat kembali menyelesaikan tugas CodeGym :) Semoga berhasil!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION