JavaRush /Blog Java /Random-MS /Kitaran hayat objek

Kitaran hayat objek

Diterbitkan dalam kumpulan
hello! Saya rasa anda tidak akan terlalu terkejut jika kami memberitahu anda bahawa saiz memori pada komputer anda adalah terhad :) Malah cakera keras, yang berkali ganda lebih besar daripada RAM, boleh diisi dengan kapasiti permainan kegemaran anda, siri TV, dan sebagainya. Untuk mengelakkan perkara ini berlaku, anda perlu memantau keadaan memori semasa dan memadam fail yang tidak diperlukan dari komputer anda. Apakah kaitan pengaturcaraan Java dengan semua ini? Langsung! Lagipun, apabila sebarang objek dicipta oleh mesin Java, memori diperuntukkan untuknya. Dalam program besar sebenar, berpuluh-puluh dan ratusan ribu objek dicipta, setiap satunya mempunyai sekeping ingatan sendiri yang diperuntukkan. Kitaran hayat objek - 1Tetapi berapa lama anda fikir semua objek ini wujud? Adakah mereka "hidup" sepanjang masa program kami berjalan? Sudah tentu tidak. Dengan semua kelebihan objek Java, mereka tidak abadi :) Objek mempunyai kitaran hidup mereka sendiri. Hari ini kita akan berehat sedikit daripada menulis kod dan melihat proses ini :) Selain itu, ia adalah sangat penting untuk memahami pengendalian program dan mengurus sumber. Jadi, di manakah kehidupan sesuatu objek bermula? Seperti seseorang - sejak kelahirannya, iaitu penciptaan.
Cat cat = new Cat();//вот сейчас и начался vital цикл нашего an object Cat!
Pertama, Mesin Maya Java memperuntukkan jumlah memori yang diperlukan untuk mencipta objek. Kemudian dia mencipta pautan kepadanya, dalam kes kami - catuntuk dapat menjejakinya. Selepas ini, semua pembolehubah dimulakan, pembina dipanggil, dan lihatlah, objek segar kami sudah pun menjalani kehidupannya sendiri :) Jangka hayat objek adalah berbeza, tiada nombor tepat di sini. Walau apa pun, untuk beberapa waktu ia tinggal di dalam program dan melaksanakan fungsinya. Tepatnya, objek adalah "hidup" selagi terdapat rujukan kepadanya. Sebaik sahaja tiada pautan yang tinggal, objek "mati". Sebagai contoh:
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 kaedah itu, main()objek kereta Lamborghini Diablo tidak lagi hidup di barisan kedua. Terdapat hanya satu pautan kepadanya, dan kini pautan ini telah diberikan null. Oleh kerana tiada rujukan yang tinggal kepada Lamborghini Diablo, ia menjadi "sampah". Ia tidak perlu untuk menetapkan semula pautan:
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 kami mencipta objek kedua, selepas itu kami mengambil rujukan lamborghinidan menetapkannya kepada objek baharu ini. Kini terdapat Lamborghini Gallardodua rujukan kepada objek, tetapi Lamborghini Diablotiada satu pun kepada objek. Oleh itu objek Diablomenjadi sampah. Dan pada masa ini, mekanisme Java terbina dalam yang dipanggil pemungut sampah, atau dengan kata lain - Pengumpul Sampah, GC, mula beroperasi.
Kitaran hayat objek - 2
Pengumpul sampah adalah mekanisme Java dalaman yang bertanggungjawab untuk membebaskan memori, iaitu, mengeluarkan objek yang tidak perlu daripadanya. Bukan sia-sia kami memilih gambar dengan pembersih vakum robot untuk menggambarkannya. Lagipun, pemungut sampah berfungsi dengan cara yang sama: di latar belakang, ia "mengembara" melalui program anda, mengumpul sampah, dan pada masa yang sama anda hampir tidak berinteraksi dengannya. Tugasnya adalah untuk mengalih keluar objek yang tidak lagi digunakan dalam program. Oleh itu, ia membebaskan memori dalam komputer untuk objek lain. Adakah anda masih ingat pada permulaan kuliah kami mengatakan bahawa dalam kehidupan biasa anda perlu memantau keadaan komputer anda dan memadam fail lama? Jadi, dalam kes objek Java, pengumpul sampah melakukan ini untuk anda. Pemungut Sampah dilancarkan berkali-kali semasa pengendalian program anda: ia tidak perlu dipanggil secara khusus dan diberi arahan, walaupun ini secara teknikal mungkin. Kemudian kita akan bercakap lebih lanjut mengenainya dan menganalisis proses kerjanya dengan lebih terperinci. Pada masa ini apabila pengumpul sampah mencapai objek, sejurus sebelum pemusnahannya, kaedah khas dipanggil pada objek - finalize(). Ia boleh digunakan untuk membebaskan beberapa sumber tambahan yang digunakan oleh objek. Kaedah tersebut finalize()tergolong dalam kelas Object. Iaitu, bersama-sama dengan equals(), hashCode()dan toString(), yang telah anda temui sebelum ini, sebarang objek mempunyainya. Perbezaannya daripada kaedah lain ialah ia adalah ... bagaimana untuk meletakkannya ... sangat berubah-ubah. Iaitu, ia tidak selalu dipanggil sebelum memusnahkan objek. Pengaturcaraan adalah perkara yang tepat. Pengaturcara memberitahu komputer untuk melakukan sesuatu, dan komputer melakukannya. Anda mungkin sudah biasa dengan tingkah laku ini, dan pada mulanya mungkin sukar untuk anda menerima idea: “Sebelum objek dimusnahkan, kaedah finalize()kelas dipanggil Object. Atau ia tidak dipanggil. Jika kita bernasib baik!" Walau bagaimanapun, ini adalah benar. Mesin Java sendiri menentukan sama ada untuk memanggil kaedah finalize()dalam setiap kes tertentu atau tidak. Sebagai contoh, mari cuba jalankan kod berikut demi percubaan:
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 mencipta objek Catdan dalam baris kod seterusnya kami menetapkan semula satu-satunya rujukan kepadanya. Dan sebagainya - sejuta kali. Kami telah mengatasi kaedah secara eksplisit finalize(), dan ia sepatutnya mencetak rentetan ke konsol sejuta kali, setiap kali sebelum memusnahkan objek Cat. Tetapi tidak! Lebih tepatnya, ia hanya berjalan 37,346 kali pada komputer saya! Iaitu, hanya dalam 1 kes daripada 27 mesin Java yang saya pasang memutuskan untuk memanggil kaedah finalize()- dalam kes lain, kutipan sampah diteruskan tanpa ini. Cuba jalankan kod ini sendiri: kemungkinan besar, hasilnya akan berbeza. Seperti yang anda lihat, finalize()sukar untuk memanggilnya rakan kongsi yang boleh dipercayai :) Oleh itu, sedikit nasihat untuk masa depan: anda tidak harus bergantung pada kaedah finalize()dalam hal membebaskan beberapa sumber kritikal. Mungkin JVM akan memanggilnya, mungkin tidak. Siapa tahu? Jika semasa hayatnya objek anda menduduki beberapa sumber yang sangat penting untuk prestasi, contohnya, ia mengekalkan sambungan terbuka ke pangkalan data, adalah lebih baik untuk mencipta kaedah khas dalam kelas anda untuk membebaskannya dan memanggilnya secara eksplisit apabila objek itu tidak diperlukan lagi. Dengan cara ini anda akan tahu dengan pasti bahawa prestasi program anda tidak akan terjejas. Pada awalnya kami mengatakan bahawa pengurusan memori dan penyingkiran sampah adalah sangat penting, dan ini adalah benar. Pengendalian sumber yang tidak sesuai dan kekurangan pemahaman tentang proses memasang objek yang tidak diperlukan boleh menyebabkan kebocoran ingatan. Ini adalah salah satu kesilapan pengaturcaraan yang paling terkenal. Kod yang ditulis secara salah oleh pengaturcara boleh mengakibatkan memori baharu diperuntukkan setiap kali untuk objek yang baru dicipta, manakala objek lama yang tidak diperlukan tidak tersedia untuk dialih keluar oleh pengumpul sampah. Memandangkan kami membuat analogi dengan pembersih vakum robot, bayangkan apa yang akan berlaku jika, sebelum memulakan robot, anda menabur stoking di sekeliling rumah, memecahkan pasu kaca dan meninggalkan set Lego yang dibuka di atas lantai. Robot itu, sudah tentu, akan cuba melakukan sesuatu, tetapi pada satu ketika ia akan tersekat.
Kitaran hayat objek - 3
Untuk berfungsi dengan baik, anda perlu memastikan lantai dalam keadaan baik dan keluarkan segala-galanya dari sana yang tidak dapat dikendalikan oleh pembersih vakum. Pengumpul sampah berfungsi dengan prinsip yang sama. Jika terdapat banyak objek yang tinggal dalam program yang tidak dapat dikumpulkan (seperti stoking atau Lego untuk pembersih vakum robot), pada satu ketika memori akan kehabisan. Dan bukan sahaja program yang anda tulis akan membeku, tetapi juga semua program lain yang berjalan pada komputer pada masa itu. Tidak akan ada ingatan yang cukup untuk mereka juga. Beginilah rupa kitaran hayat objek dan pengumpul sampah di Jawa. Tidak perlu menghafal ini: anda hanya perlu memahami prinsip operasi. Dalam kuliah seterusnya kita akan bercakap tentang proses ini dengan lebih terperinci, tetapi buat masa ini anda boleh kembali untuk menyelesaikan masalah JavaRush :) Semoga berjaya!
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION