JavaRush /Java Blog /Random-ID /Lebih lanjut tentang pengumpul sampah di Jawa

Lebih lanjut tentang pengumpul sampah di Jawa

Dipublikasikan di grup Random-ID
Halo! Pada kuliah terakhir, kita pertama kali mengenal mekanisme bawaan bahasa Java - pengumpul sampah. Ini beroperasi di latar belakang saat program Anda berjalan, mengumpulkan objek yang tidak diperlukan, yang nantinya akan dihapus. Dengan cara ini membebaskan memori untuk membuat objek baru di masa depan. Dalam kuliah ini kita akan melihat lebih dekat prinsip pengoperasiannya. Misalnya, bagaimana dan pada titik manakah suatu benda menjadi tidak diperlukan lagi? Dan bagaimana pemulung mengetahui hal ini? Kami akan menjawab pertanyaan-pertanyaan ini :) Ceramah kami lebih bersifat gambaran umum: materi ini tidak perlu dihafal. Hal ini dimaksudkan untuk memperluas wawasan Anda tentang cara kerja memori dan pemulung, jadi cukup membacanya dan mempelajari sesuatu yang baru untuk diri Anda sendiri :) Ayo! Hal pertama yang perlu Anda ingat adalah bahwa pengumpul sampah berjalan secara paralel dengan program Anda . Itu bukan bagian darinya dan berfungsi secara terpisah: untuk menjelaskannya, pada kuliah terakhir kami memberikan analogi dengan robot penyedot debu. Faktanya, hal ini tidak selalu terjadi. Sebelumnya, pengumpul sampah didesain sedemikian rupa sehingga bekerja di thread yang sama dengan program Anda. Dan menurut jadwal tertentu, setiap beberapa menit sekali, ia mulai memeriksa keberadaan objek yang tidak diperlukan dalam program. Masalahnya adalah selama pemeriksaan dan pengumpulan sampah ini, program terhenti dan tidak dijalankan. Bayangkan Anda sedang duduk di kantor sambil bekerja. Tapi kemudian seorang wanita pembersih datang dan perlu mencuci lantai di kamar. Dia mengusir Anda dari belakang komputer selama 5 menit dan Anda menunggu sampai dia selesai membersihkan. Selama ini Anda tidak dapat bekerja. Kira-kira beginilah cara kerja pengumpul sampah :) Belakangan, mekanisme ini diubah, dan sekarang pengumpul sampah bekerja di latar belakang, tanpa memperlambat kerja program itu sendiri. Anda sudah mengetahui bahwa suatu objek mati ketika tidak ada lagi referensi yang tersisa padanya. Namun pengumpul sampah sebenarnya tidak menghitung referensi ke . Pertama, ini bisa memakan waktu cukup lama. Kedua, ini tidak terlalu efektif. Bagaimanapun, objek bisa merujuk satu sama lain! Lebih lanjut tentang pemulung - 2Gambar tersebut menunjukkan contoh di mana 3 objek saling mereferensikan, namun tidak ada orang lain yang mereferensikannya. Artinya, mereka tidak diperlukan agar program lainnya dapat berjalan. Jika pengumpul sampah hanya menghitung referensi, ketiga objek ini akan tetap ada dan tidak akan mengosongkan memori: ada referensi ke objek tersebut! Itu bisa dibandingkan dengan pesawat luar angkasa. Selama penerbangan, para astronot memutuskan untuk memeriksa daftar suku cadang untuk diperbaiki dan menemukan di antaranya setir dan pedal dari mobil biasa. Mereka jelas tidak diperlukan di sini dan memakan ruang ekstra. Meskipun bagian-bagian ini saling terhubung dan memiliki beberapa fungsi, dalam rangka pengoperasian pesawat ruang angkasa, bagian-bagian tersebut merupakan sampah yang tidak perlu, yang sebaiknya dibuang. Oleh karena itu, Java memutuskan untuk menjadikan dasar pengumpulan sampah tidak menghitung referensi, tetapi membagi objek menjadi dua jenis - dapat dijangkau dan tidak dapat dijangkau. Bagaimana cara menentukan apakah suatu objek dapat dijangkau? Segala sesuatu yang cerdik itu sederhana. Suatu objek dapat dijangkau jika direferensikan oleh objek lain yang dapat dijangkau. Hal ini menghasilkan “rantai keterjangkauan”. Ini dimulai ketika program dimulai dan berlanjut sepanjang durasi operasinya. Tampilannya seperti ini: Lebih lanjut tentang pemulung - 4Panah pada gambar menunjukkan kode pelaksana program kita. Dalam kode, misalnya dalam metode main(), referensi ke objek dibuat. Objek-objek ini dapat merujuk ke objek-objek baru, objek-objek lain, dan seterusnya. Sebuah rantai tautan objek terbentuk . Jika suatu objek dapat dijangkau melalui rantai tautan ini ke “tautan akar”, yaitu yang dibuat secara langsung dalam kode yang dijalankan, maka objek tersebut dianggap dapat dijangkau. Dalam gambar kami, mereka ditandai dengan warna biru. Tetapi jika suatu objek telah keluar dari rantai ini, artinya, tidak ada variabel dalam kode yang sedang dieksekusi yang berisi referensi ke objek tersebut, dan juga tidak mungkin untuk menjangkaunya melalui "rantai tautan" - objek tersebut dianggap tidak dapat dijangkau. Dalam program kami, dua objek tersebut ditandai dengan warna merah. Harap diperhatikan: objek “merah” ini memiliki tautan satu sama lain. Namun, seperti yang kami katakan sebelumnya, pemulung sampah modern di Java tidak melakukan penghitungan referensi. Ini menentukan apakah suatu objek dapat dijangkau atau tidak . Oleh karena itu, kedua benda berwarna merah pada gambar tersebut akan menjadi mangsanya. Sekarang mari kita lihat keseluruhan proses dari awal sampai akhir, dan pada saat yang sama mari kita lihat cara kerja memori di Java :) Semua objek di Java disimpan di area memori khusus yang disebut heap . Dalam bahasa sehari-hari, “tumpukan” adalah tumpukan benda yang segala sesuatunya berserakan. Namun heap di jawa tidak seperti itu. Ini memiliki struktur yang sangat logis dan masuk akal. Suatu hari, pemrogram Java menemukan bahwa semua objek dalam program mereka dapat dibagi menjadi dua jenis - secara relatif, objek sederhana dan objek "berumur panjang" . Benda yang “berumur panjang” adalah benda yang mampu bertahan dari banyak pengumpulan sampah. Paling sering mereka akan ada sampai akhir program. Akibatnya, tumpukan umum, tempat semua objek yang dibuat disimpan, dibagi menjadi beberapa bagian. Bagian pertama memiliki nama yang indah - Eden ("Taman Eden" dalam Alkitab). Ini adalah nama yang bagus karena ini adalah tempat tujuan objek setelah dibuat. Di bagian inilah memori dialokasikan untuk objek baru saat kita menulisnew. Banyak objek yang dapat dibuat, dan ketika ruang di area ini habis, pengumpulan sampah “cepat” pertama dimulai. Harus dikatakan bahwa pengumpul sampah sangat cerdas dan memilih algoritma kerja tergantung pada apa yang lebih banyak di tumpukan - sampah atau benda kerja. Jika hampir semua objek adalah sampah, kolektor menandai objek "hidup" dan memindahkannya ke area memori lain, setelah itu area saat ini dibersihkan sepenuhnya. Jika sampahnya sedikit dan sebagian besar ditempati oleh benda hidup, ia menandai sampah tersebut, membersihkannya, dan menata sisa benda tersebut. Kami mengatakan “kolektor menandai objek “hidup” dan memindahkannya ke lokasi memori lain,” tapi yang mana? Area memori tempat semua objek yang bertahan setidaknya satu kumpulan sampah ditransfer disebut Survival Space . Survival Space, pada gilirannya, dibagi menjadi beberapa generasi . Setiap objek diberi satu generasi berdasarkan berapa banyak pengumpulan sampah yang dialaminya. Jika ada, maka itu milik “Generasi 1”, jika 5 – milik “Generasi 5”. Bersama-sama, Eden dan Survival Space membentuk sebuah kawasan yang disebut Generasi Muda . Selain Generasi Muda, ada area memori lain di tumpukan - Generasi Tua (“generasi lama”). Ini adalah benda-benda berumur panjang yang bertahan dari banyak pengumpulan sampah. Lebih menguntungkan menyimpannya secara terpisah dari yang lain. Dan hanya jika area Generasi Lama sudah penuh, yaitu. Meskipun ada begitu banyak objek yang berumur panjang dalam program sehingga tidak ada cukup memori, pengumpulan sampah secara menyeluruh dilakukan. Ini memproses tidak hanya satu area memori, tetapi secara umum semua objek yang dibuat oleh mesin Java. Tentu saja, ini membutuhkan lebih banyak waktu dan sumber daya. Itulah mengapa diputuskan untuk menyimpan benda berumur panjang secara terpisah. Ketika ruang di area lain habis, apa yang disebut “pengumpulan sampah cepat” dilakukan. Ini hanya mencakup satu area, sehingga lebih ekonomis dan lebih cepat. Pada akhirnya, bahkan ketika area untuk para centenarian sudah tersumbat, pembersihan menyeluruh pun ikut dilakukan. Jadi, alat yang paling “berat” digunakan oleh assembler hanya jika tidak diperlukan lagi. Secara skematis, struktur heap dan pembersihan terlihat seperti ini: Lebih lanjut tentang pemulung - 5
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION