JavaRush /Blog Java /Random-MS /Lebih lanjut mengenai pemungut sampah di Jawa

Lebih lanjut mengenai pemungut sampah di Jawa

Diterbitkan dalam kumpulan
hello! Dalam kuliah terakhir, kami mula-mula berkenalan dengan mekanisme terbina dalam bahasa Jawa - pemungut sampah. Ia beroperasi di latar belakang semasa program anda sedang berjalan, mengumpul objek yang telah menjadi tidak perlu, yang kemudiannya akan dipadamkan. Dengan cara ini ia membebaskan memori untuk mencipta objek baharu pada masa hadapan. Dalam kuliah ini kita akan melihat dengan lebih dekat prinsip operasinya. Sebagai contoh, bagaimana dan pada titik apakah objek menjadi tidak diperlukan? Dan bagaimana pemungut sampah tahu tentang perkara ini? Kami akan menjawab soalan-soalan ini :) Kuliah kami lebih kepada gambaran keseluruhan: bahan ini tidak perlu dihafal. Ia bertujuan untuk meluaskan pandangan anda mengenai kerja ingatan dan pemungut sampah, jadi cukuplah untuk membacanya dan mempelajari sesuatu yang baharu untuk diri sendiri :) Jom! Perkara pertama yang anda perlu ingat ialah pemungut sampah berjalan selari dengan program anda . Ia bukan sebahagian daripadanya dan berfungsi secara berasingan: untuk menerangkan perkara ini, dalam kuliah terakhir kami memberikan analogi dengan pembersih vakum robot. Sebenarnya, ini tidak selalu berlaku. Sebelum ini, pemungut sampah telah direka bentuk sedemikian rupa sehingga ia berfungsi dalam urutan yang sama seperti program anda. Dan mengikut beberapa jadual, sekali setiap beberapa minit, ia mula menyemak kehadiran objek yang tidak perlu dalam program. Masalahnya ialah semasa pemeriksaan dan kutipan sampah ini, program terhenti dan tidak dilaksanakan. Bayangkan anda sedang duduk di pejabat di tempat kerja. Tetapi kemudian seorang wanita pembersih datang dan perlu mencuci lantai di dalam bilik. Dia menendang anda keluar dari belakang komputer selama 5 minit dan anda menunggu sehingga dia selesai membersihkan. Pada masa ini anda tidak boleh bekerja. Beginilah cara pemungut sampah dahulu berfungsi :) Kemudian, mekanisme ini telah diubah, dan kini pemungut sampah berfungsi di latar belakang, tanpa memperlahankan kerja program itu sendiri. Anda sudah tahu bahawa objek mati apabila tiada rujukan yang tersisa kepadanya. Tetapi pemungut sampah sebenarnya tidak mengira rujukan kepada . Pertama, ia boleh menjadi agak panjang. 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 yang merujuknya. Iaitu, mereka tidak diperlukan untuk seluruh program berfungsi. Jika pengumpul sampah hanya mengira rujukan, kesemua 3 objek ini akan kekal dan tidak akan membebaskan ingatan: terdapat rujukan kepada mereka! Ia boleh dibandingkan dengan kapal angkasa. Semasa penerbangan, angkasawan memutuskan untuk menyemak senarai alat ganti untuk dibaiki dan mendapati antaranya stereng dan pedal dari kereta biasa. Mereka jelas tidak diperlukan di sini dan mengambil ruang tambahan. Walaupun bahagian-bahagian ini disambungkan dan mempunyai beberapa fungsi, dalam rangka operasi kapal angkasa mereka adalah sampah yang tidak perlu, yang lebih baik untuk disingkirkan. Oleh itu, Java memutuskan untuk membuat asas pengumpulan sampah tidak mengira rujukan, tetapi membahagikan objek kepada dua jenis - boleh dicapai dan tidak boleh dicapai. Bagaimana untuk menentukan sama ada objek boleh dicapai? Semua yang bijak adalah mudah. Objek boleh dicapai jika ia dirujuk oleh objek lain yang boleh dicapai. Ini menghasilkan "rantaian kebolehcapaian". Ia bermula apabila program bermula dan berterusan sepanjang tempoh operasinya. Ia kelihatan seperti ini: Lebih lanjut mengenai pemungut sampah - 4Anak panah dalam rajah menunjukkan kod pelaksana program kami. Dalam kod, contohnya dalam kaedah main(), rujukan kepada objek dibuat. Objek ini boleh merujuk kepada objek baharu, objek tersebut kepada objek lain, dan sebagainya. Rangkaian pautan objek terbentuk . Jika objek boleh dicapai melalui rantaian pautan ini ke "pautan akar", iaitu, objek yang dicipta secara langsung dalam kod pelaksana, ia dianggap boleh dicapai. Dalam gambar kami, mereka ditunjukkan dengan warna biru. Tetapi jika objek telah terkeluar daripada rantaian ini, iaitu, tiada pembolehubah dalam kod yang sedang dilaksanakan mengandungi rujukan kepadanya, dan juga mustahil untuk mencapainya melalui "rantaian pautan" - ia dianggap tidak dapat dicapai. Dalam program kami, dua objek sedemikian ditunjukkan dengan warna merah. Sila ambil perhatian: objek "merah" ini mempunyai pautan antara satu sama lain. Tetapi, seperti yang kami katakan sebelum ini, pengumpul sampah moden di Jawa tidak melakukan pengiraan rujukan. Ia menentukan sama ada objek boleh dicapai atau tidak boleh dicapai . Oleh itu, dua objek merah dalam gambar itu akan menjadi mangsanya. Sekarang mari kita lihat keseluruhan proses dari awal hingga akhir, dan pada masa yang sama mari kita lihat bagaimana memori berfungsi dalam Java :) Semua objek dalam Java disimpan dalam kawasan memori khas yang dipanggil heap . Dalam bahasa biasa, "timbunan" adalah gunung objek di mana segala-galanya terletak di sekeliling dalam keadaan berantakan. Tetapi timbunan di Jawa tidak seperti itu. Ia mempunyai struktur yang sangat logik dan munasabah. Pada suatu hari yang baik, pengaturcara Java mendapati bahawa semua objek dalam program mereka boleh dibahagikan kepada dua jenis - secara relatifnya, objek mudah dan objek "berumur panjang" . Objek "berumur panjang" ialah objek yang terselamat daripada banyak kutipan sampah. Selalunya mereka akan wujud sehingga akhir program. Akibatnya, timbunan biasa, di mana semua objek yang dicipta disimpan, dibahagikan kepada beberapa bahagian. Bahagian pertama mempunyai nama yang indah - Eden ("Taman Eden" alkitabiah). Ini adalah nama yang hebat kerana di sinilah objek pergi selepas ia dicipta. Di bahagian inilah memori diperuntukkan untuk objek baru apabila kita menulisnew. Banyak objek boleh dibuat, dan apabila ruang kehabisan di kawasan ini, pengumpulan sampah "cepat" pertama bermula. Ia mesti dikatakan bahawa pemungut sampah sangat pintar dan memilih algoritma kerja bergantung pada apa yang lebih dalam timbunan - sampah atau objek kerja. Jika hampir semua objek adalah sampah, pengumpul menandakan objek "hidup" dan memindahkannya ke kawasan ingatan lain, selepas itu kawasan semasa dibersihkan sepenuhnya. Sekiranya terdapat sedikit sampah dan kebanyakannya diduduki oleh objek hidup, ia menandakan sampah, membersihkannya, dan menyusun objek yang tinggal. Kami berkata "pengumpul menandakan objek "hidup" dan mengalihkannya ke lokasi ingatan yang lain," tetapi yang manakah? Kawasan ingatan di mana semua objek yang bertahan sekurang-kurangnya satu kutipan sampah dipindahkan dipanggil Survival Space . Survival Space pula dibahagikan kepada beberapa generasi . Setiap objek diberikan generasi berdasarkan jumlah kutipan sampah yang telah dialaminya. Jika ada, ia tergolong dalam "Generasi 1", jika 5 - kepada "Generasi 5". Bersama-sama, Eden dan Survival Space membentuk kawasan yang dipanggil Generasi Muda . Selain Generasi Muda, terdapat satu lagi kawasan ingatan dalam timbunan - Generasi Lama ("generasi lama"). Ini adalah objek yang sangat lama yang telah terselamat daripada banyak kutipan sampah. Lebih menguntungkan untuk menyimpannya secara berasingan daripada yang lain. Dan hanya apabila kawasan Generasi Lama penuh, i.e. Walaupun terdapat begitu banyak objek yang berumur panjang dalam program yang tidak mempunyai memori yang mencukupi, pengumpulan sampah yang lengkap dilakukan. Ia memproses bukan hanya satu kawasan memori, tetapi secara amnya semua objek yang dicipta oleh mesin Java. Sememangnya, ia memerlukan lebih banyak masa dan sumber. Itulah sebabnya diputuskan untuk menyimpan objek tahan lama secara berasingan. Apabila ruang kehabisan di kawasan lain, apa yang dipanggil "pengumpulan sampah pantas" dijalankan. Ia meliputi hanya satu kawasan, dan disebabkan ini ia lebih menjimatkan dan lebih pantas. Pada akhirnya, apabila kawasan untuk centenarians pun sudah tersumbat, pembersihan penuh memasuki pergaduhan. Oleh itu, alat yang paling "berat" digunakan oleh pemasang hanya apabila ia tidak lagi diperlukan. Secara skematik, struktur timbunan dan pembersihan kelihatan seperti ini: Lebih lanjut mengenai pemungut sampah - 5
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION