JavaRush /Java Blog /Random-ID /Siklus hidup objek

Siklus hidup objek

Dipublikasikan di grup Random-ID
Halo! Saya rasa Anda tidak akan terlalu terkejut jika kami memberi tahu Anda bahwa ukuran memori di komputer Anda terbatas :) Bahkan hard drive, yang jauh lebih besar dari RAM, dapat diisi hingga kapasitasnya dengan game favorit Anda, serial TV, dan seterusnya. Untuk mencegah hal ini terjadi, Anda perlu memantau kondisi memori saat ini dan menghapus file yang tidak diperlukan dari komputer Anda. Apa hubungannya pemrograman Java dengan semua ini? Langsung! Lagi pula, ketika suatu objek dibuat oleh mesin Java, memori dialokasikan untuknya. Dalam program yang sangat besar, puluhan dan ratusan ribu objek dibuat, yang masing-masing memiliki alokasi memorinya sendiri. Siklus hidup objek - 1Tapi menurut Anda berapa lama semua benda ini ada? Apakah mereka “hidup” sepanjang program kita berjalan? Tentu tidak. Dengan segala kelebihan objek Java, mereka tidak abadi :) Objek memiliki siklus hidupnya sendiri. Hari ini kita akan istirahat sejenak dari penulisan kode dan melihat prosesnya :) Selain itu, ini sangat penting untuk memahami pengoperasian program dan mengelola sumber daya. Jadi, di manakah kehidupan suatu benda dimulai? Seperti manusia - sejak lahir, yaitu penciptaan.
Cat cat = new Cat();//вот сейчас и начался vital цикл нашего an object Cat!
Pertama, Mesin Virtual Java mengalokasikan jumlah memori yang diperlukan untuk membuat objek. Kemudian dia membuat tautan ke sana, dalam kasus kami - catagar dapat melacaknya. Setelah ini, semua variabel diinisialisasi, konstruktor dipanggil, dan lihatlah, objek baru kita sudah menjalani kehidupannya sendiri :) Umur objek berbeda, tidak ada angka pasti di sini. Bagaimanapun, untuk beberapa waktu ia tinggal di dalam program dan menjalankan fungsinya. Tepatnya, suatu benda dikatakan “hidup” selama ada referensi terhadapnya. Segera setelah tidak ada tautan yang tersisa, 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 prosesnya, main()objek mobil Lamborghini Diablo sudah tidak hidup lagi di baris kedua. Hanya ada satu tautan ke sana, dan sekarang tautan ini telah ditetapkan null. Karena tidak ada lagi referensi yang tersisa tentang Lamborghini Diablo, maka ia menjadi “sampah”. Tautan tidak perlu disetel ulang:
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 membuat objek kedua, setelah itu kita mengambil referensi lamborghinidan menetapkannya ke objek baru ini. Sekarang ada Lamborghini Gallardodua referensi ke objek tersebut, namun Lamborghini Diablotidak ada satu pun yang merujuk ke objek tersebut. Oleh karena itu benda tersebut Diablomenjadi sampah. Dan pada saat ini, mekanisme bawaan Java yang disebut pengumpul sampah, atau dengan kata lain - Pengumpul Sampah, GC, mulai beroperasi.
Siklus hidup objek - 2
Pengumpul sampah adalah mekanisme internal Java yang bertanggung jawab untuk mengosongkan memori, yaitu menghapus objek yang tidak diperlukan darinya. Bukan tanpa alasan kami memilih gambar dengan robot penyedot debu untuk menggambarkannya. Lagi pula, pengumpul sampah bekerja dengan cara yang hampir sama: di latar belakang, ia “berjalan” melalui program Anda, mengumpulkan sampah, dan pada saat yang sama Anda praktis tidak berinteraksi dengannya. Tugasnya adalah menghilangkan objek-objek yang sudah tidak digunakan lagi dalam program. Dengan demikian, ini mengosongkan memori di komputer untuk objek lain. Apakah Anda ingat di awal kuliah kami mengatakan bahwa dalam kehidupan sehari-hari Anda harus memantau keadaan komputer Anda dan menghapus file lama? Jadi, dalam kasus objek Java, pengumpul sampah melakukan ini untuk Anda. Pengumpul Sampah diluncurkan berkali-kali selama pengoperasian program Anda: program ini tidak perlu dipanggil secara spesifik dan diberi perintah, meskipun secara teknis hal ini memungkinkan. Nanti kita akan membicarakannya lebih jauh dan menganalisis proses kerjanya lebih detail. Pada saat pemulung mencapai suatu objek, tepat sebelum kehancurannya, metode khusus dipanggil pada objek tersebut - finalize(). Ini dapat digunakan untuk mengosongkan beberapa sumber daya tambahan yang digunakan objek. Metode finalize()milik kelas Object. Artinya, bersama dengan equals(), hashCode()dan toString(), yang telah Anda temui sebelumnya, objek apa pun memilikinya. Perbedaannya dari metode lain adalah... bagaimana mengatakannya... sangat berubah-ubah. Yaitu, tidak selalu dipanggil sebelum menghancurkan suatu benda. Pemrograman adalah hal yang tepat. Pemrogram memerintahkan komputer untuk melakukan sesuatu, dan komputer melakukannya. Anda mungkin sudah terbiasa dengan perilaku ini, dan pada awalnya mungkin sulit bagi Anda untuk menerima gagasan: “Sebelum objek dihancurkan, metode finalize()kelas dipanggil Object. Atau tidak disebut. Jika kita beruntung!" Namun, ini benar. Mesin Java sendiri yang menentukan apakah akan memanggil metode finalize()dalam setiap kasus tertentu atau tidak. Sebagai contoh, mari kita coba jalankan kode berikut untuk keperluan 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 уничтожен!");
   }
}
Kami membuat sebuah objek Catdan di baris kode berikutnya kami mengatur ulang satu-satunya referensi ke sana. Dan - sejuta kali. Kami telah secara eksplisit mengganti metode ini finalize(), dan metode tersebut akan mencetak string ke konsol jutaan kali, setiap kali sebelum menghancurkan objek Cat. Tapi tidak! Tepatnya, ini hanya berjalan 37.346 kali di komputer saya! Artinya, hanya dalam 1 dari 27 kasus mesin Java yang saya instal memutuskan untuk memanggil suatu metode finalize()- dalam kasus lain, pengumpulan sampah dilanjutkan tanpa ini. Coba jalankan kode ini sendiri: kemungkinan besar hasilnya akan berbeda. Seperti yang Anda lihat, finalize()sulit untuk menyebutnya sebagai mitra yang dapat diandalkan :) Oleh karena itu, sedikit saran untuk masa depan: Anda tidak boleh mengandalkan metode ini finalize()jika terjadi pelepasan beberapa sumber daya penting. Mungkin JVM akan menyebutnya, mungkin juga tidak. Siapa tahu? Jika selama masa pakainya objek Anda menempati beberapa sumber daya yang sangat penting untuk kinerja, misalnya, ia tetap membuka koneksi ke database, lebih baik membuat metode khusus di kelas Anda untuk membebaskannya dan memanggilnya secara eksplisit saat objek tersebut berada. tidak diperlukan lagi. Dengan cara ini Anda akan mengetahui dengan pasti bahwa kinerja program Anda tidak akan terganggu. Pada awalnya kami mengatakan bahwa manajemen memori dan penghapusan sampah sangat penting, dan ini benar. Penanganan sumber daya yang tidak tepat dan kurangnya pemahaman tentang proses perakitan objek yang tidak diperlukan dapat menyebabkan kebocoran memori. Ini adalah salah satu kesalahan pemrograman yang paling terkenal. Kode yang ditulis secara tidak benar oleh pemrogram dapat mengakibatkan memori baru dialokasikan setiap kali untuk objek yang baru dibuat, sedangkan objek lama yang tidak diperlukan tidak tersedia untuk dihapus oleh pengumpul sampah. Karena kita membuat analogi dengan robot penyedot debu, bayangkan apa yang akan terjadi jika, sebelum memulai robot, Anda menyebarkan kaus kaki di sekitar rumah, memecahkan vas kaca, dan meninggalkan Lego yang sudah dibongkar di lantai. Robot tentu saja akan mencoba melakukan sesuatu, tetapi pada suatu saat ia akan macet.
Siklus hidup objek - 3
Agar dapat berfungsi dengan baik, Anda perlu menjaga lantai dalam kondisi baik dan menyingkirkan segala sesuatu yang tidak dapat ditangani oleh penyedot debu. Pengumpul sampah bekerja dengan prinsip yang sama. Jika ada banyak benda tersisa dalam program yang tidak dapat dikumpulkannya (seperti kaus kaki atau Lego untuk robot penyedot debu), suatu saat memori akan habis. Dan tidak hanya program yang Anda tulis yang akan dibekukan, tetapi semua program lain yang berjalan di komputer pada saat itu. Memori mereka juga tidak akan cukup. Seperti inilah siklus hidup objek dan pengumpul sampah di Java. Tidak perlu menghafal ini: cukup pahami prinsip pengoperasiannya. Pada kuliah berikutnya kita akan membahas proses ini secara lebih rinci, tetapi untuk saat ini Anda dapat kembali memecahkan masalah JavaRush :) Semoga berhasil!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION