CodeGym /Blog Java /rawak /Lebih lanjut mengenai pemungut sampah
John Squirrels
Tahap
San Francisco

Lebih lanjut mengenai pemungut sampah

Diterbitkan dalam kumpulan
Hai! Dalam pelajaran lepas, kami mula-mula berkenalan dengan pengumpul sampah terbina dalam Java dan mendapat gambaran kasar tentang cara ia berfungsi. Ia berfungsi di latar belakang semasa program anda sedang berjalan, mengumpul objek yang tidak diperlukan yang akan dipadamkan kemudian. Oleh itu, ia membebaskan memori yang boleh digunakan untuk mencipta objek baharu pada masa hadapan.
Lebih lanjut mengenai pemungut sampah - 1
Dalam pelajaran ini, kita akan membincangkan dengan lebih terperinci cara ia berfungsi. Sebagai contoh, bagaimana dan bila objek menjadi tidak diperlukan? Dan bagaimana pemungut sampah mengetahui? Ini ialah soalan yang akan kami jawab semasa pelajaran hari ini :) Pelajaran akan lebih seperti gambaran keseluruhan: anda tidak perlu mempelajari bahan ini dengan teliti. Niatnya adalah terutamanya untuk mengembangkan visi anda tentang cara ingatan dan pengumpul sampah berfungsi, jadi baca sahaja dan cari sesuatu yang baharu untuk diri sendiri :) Jom! Perkara pertama yang perlu anda ingat ialah pemungut sampah berfungsi selari dengan program anda. Ia bukan sebahagian daripada program anda. Ia berjalan secara berasingan (dalam pelajaran lepas, kami membandingkannya dengan pembersih vakum robot) Tetapi ia tidak selalu begitu. Pengumpulan sampah pernah dilakukan pada urutan yang sama seperti program anda. Pada beberapa jadual (sekali setiap beberapa minit), pemungut sampah akan menyemak kehadiran objek yang tidak diingini dalam program. Masalahnya ialah program akan digantung (tidak dilaksanakan) semasa pemeriksaan dan pengumpulan sampah ini. Bayangkan anda sedang duduk di pejabat anda di tempat kerja. Tetapi kemudian wanita pembersih masuk untuk mencuci lantai. Dia menghalau anda dari komputer anda selama 5 minit dan anda menunggu sehingga dia selesai membersihkan. Pada masa ini, anda tidak dapat bekerja. Begitulah kira-kira cara pengumpulan sampah dahulu berfungsi :) Mekanisme ini kemudiannya ditukar, dan kini pemungut sampah berjalan di latar belakang, tidak menghalang kerja program itu sendiri. Anda sudah tahu bahawa objek mati apabila ia tidak mempunyai rujukan lagi. Dalam realiti,pemungut sampah tidak mengira rujukan objek . Pertama, ini boleh mengambil masa yang lama. Kedua, ia tidak begitu berkesan. Lagipun, objek boleh merujuk antara satu sama lain! Lebih lanjut mengenai pemungut sampah - 2Rajah menunjukkan contoh di mana 3 objek merujuk antara satu sama lain, tetapi tiada orang lain merujuk kepada mereka. Dalam erti kata lain, seluruh program tidak memerlukannya. Jika pengumpul sampah hanya mengira rujukan, 3 objek ini tidak akan dikumpulkan dan memori tidak akan dibebaskan (ada rujukan kepada mereka!). Kita boleh membandingkan ini dengan kapal angkasa. Semasa penerbangan, angkasawan memutuskan untuk menyemak senarai alat ganti yang tersedia untuk dibaiki. Antara lain, mereka menemui stereng dan pedal dari kereta biasa. Jelas sekali, mereka tidak diperlukan di sini dan mengambil ruang secara tidak perlu (walaupun kedua-dua bahagian ini berkaitan antara satu sama lain dan mempunyai beberapa fungsi). Tetapi di dalam kapal angkasa, mereka adalah sampah yang tidak berguna yang harus dibuang. Sehubungan itu, di Jawa, keputusan dibuat untuk mengutip sampah bukan berdasarkan pengiraan rujukan,boleh dicapai dan tidak boleh dicapai . Bagaimanakah kita menentukan sama ada sesuatu objek boleh dicapai? Semuanya cerdik semata-mata. Objek boleh dicapai jika ia dirujuk oleh objek lain yang boleh dicapai. Oleh itu, kita mendapat "rantaian kebolehcapaian". Ia bermula apabila program bermula dan berterusan sepanjang tempoh program. Ia kelihatan seperti ini: Lebih lanjut mengenai pemungut sampah - 3 Anak panah dalam rajah menunjukkan kod boleh laku program kami. Kod (contohnya, main()kaedah) mencipta rujukan kepada objek. Objek ini boleh merujuk kepada objek lain, objek tersebut kepada objek lain, dan sebagainya. Ini membentuk rantai rujukan. Jika anda boleh menjejak sepanjang rantai daripada objek ke "rujukan akar" (yang dibuat secara langsung dalam kod boleh laku), maka ia dianggap boleh dicapai. Objek sedemikian ditandakan hitam dalam gambar. Tetapi objek tidak boleh dicapai jika objek tercicir daripada rantai ini, iaitu tiada satu pun pembolehubah dalam kod yang sedang dilaksanakan merujuknya, dan ia tidak boleh dicapai melalui "rantai rujukan". Dalam program kami, dua objek sedemikian ditandakan merah. Ambil perhatian bahawa objek "merah" ini mempunyai rujukan antara satu sama lain. Tetapi seperti yang kami katakan sebelum ini, pengumpul sampah moden Java tidak mengira rujukan. Ia menentukan sama ada objek boleh dicapai atau tidak boleh dicapai. Akibatnya, ia akan merampas dua objek merah dalam rajah. Sekarang mari kita lihat keseluruhan proses dari awal hingga akhir. Dengan berbuat demikian, kita juga akan melihat bagaimana memori disusun dalam Java :) Semua objek Java disimpan dalam kawasan memori khas yang dipanggil heap . Dalam bahasa sehari-hari, timbunan biasanya merupakan gunung barang, di mana segala-galanya bercampur-campur. Tetapi itu bukan timbunan di Jawa. Strukturnya sangat logik dan munasabah. Pada satu ketika, pengaturcara Java mendapati bahawa semua objek mereka boleh dibahagikan kepada dua jenis: objek mudah dan "objek berumur panjang". "Objek berumur panjang" ialah objek yang terselamat daripada banyak pusingan pengumpulan sampah. Mereka biasanya hidup sehingga program tamat. Pada akhirnya, timbunan penuh, di mana semua objek disimpan, dibahagikan kepada beberapa bahagian. Bahagian pertama mempunyai nama yang indah: eden(dari "Taman Eden" alkitabiah). Nama ini sesuai, kerana di sinilah objek berakhir selepas ia dicipta. Ini adalah bahagian memori di mana objek baharu dicipta apabila kami menggunakan kata kunci baharu. Banyak objek boleh dibuat. Apabila kawasan ini kehabisan ruang, pengumpulan sampah "cepat" awal bermula. Kita mesti mengatakan bahawa pengutip sampah itu sangat bijak. Ia memilih algoritma berdasarkan sama ada timbunan mempunyai lebih banyak sampah atau lebih banyak objek hidup. Jika hampir semua objek adalah sampah, pengumpul menandakan objek hidup dan memindahkannya ke kawasan ingatan yang lain. Kemudian kawasan semasa dibersihkan sepenuhnya. Jika tidak ada banyak sampah, dan timbunan itu kebanyakannya adalah objek hidup, pemungut menandai sampah, membersihkannya dan mengemas objek lain bersama-sama. Kami berkata "ruang hidup . Ruang kelangsungan hidup , seterusnya, dibahagikan kepada beberapa generasi . Setiap objek kepunyaan generasi tertentu, bergantung pada bilangan pusingan kutipan sampah yang telah terselamat. Jika objek telah terselamat daripada satu pusingan kutipan sampah, maka ia berada dalam "Generasi 1"; jika 5, maka "Generasi 5". Bersama-sama, eden dan ruang hidup membentuk kawasan yang dipanggil generasi muda . Sebagai tambahan kepada generasi muda, timbunan mempunyai satu lagi kawasan ingatan yang dipanggil generasi lama. Ini adalah kawasan di mana objek berumur panjang yang terselamat daripada banyak pusingan kutipan sampah berakhir. Terdapat kelebihan untuk memisahkan mereka daripada yang lain. Kutipan sampah penuh dilakukan hanya apabila generasi lama penuh, iaitu terdapat begitu banyak objek yang berumur panjang dalam program yang tidak mempunyai ingatan yang mencukupi. Proses ini melibatkan lebih daripada satu kawasan ingatan. Secara umum, ia melibatkan semua objek yang dicipta oleh mesin Java. Sememangnya, ini memerlukan lebih banyak masa dan sumber. Ini adalah tepat keputusan dibuat untuk menyimpan objek tahan lama secara berasingan. "Kutipan sampah cepat" dijalankan apabila kawasan lain kehabisan ruang. Ini melibatkan hanya satu kawasan, yang menjadikannya lebih pantas dan lebih cekap. Akhirnya, apabila kawasan untuk objek tahan lama terisi sepenuhnya, kutipan sampah penuh dicetuskan. Oleh itu, pengumpul menggunakan alat "paling berat" hanya apabila mustahil untuk mengelakkannya. Berikut ialah gambaran visual struktur timbunan dan pengumpulan sampah: Lebih lanjut mengenai pemungut sampah - 4
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION