CodeGym /Java Blog /Acak /Lebih lanjut tentang pengumpul sampah
John Squirrels
Level 41
San Francisco

Lebih lanjut tentang pengumpul sampah

Dipublikasikan di grup Acak
Hai! Dalam pelajaran terakhir, pertama-tama kita berkenalan dengan pengumpul sampah bawaan Java dan mendapatkan gambaran kasar tentang cara kerjanya. Ini bekerja di latar belakang saat program Anda berjalan, mengumpulkan objek yang tidak perlu yang akan dihapus nanti. Dengan demikian, ini membebaskan memori yang dapat digunakan untuk membuat objek baru di masa mendatang.
Lebih lanjut tentang pengumpul sampah - 1
Dalam pelajaran ini, kita akan membahas secara lebih rinci bagaimana cara kerjanya. Misalnya, bagaimana dan kapan suatu objek menjadi tidak diperlukan? Dan bagaimana pengumpul sampah mengetahuinya? Ini adalah pertanyaan yang akan kami jawab selama pelajaran hari ini :) Pelajaran akan lebih seperti ikhtisar: Anda tidak perlu mempelajari materi ini dengan hati. Tujuannya terutama untuk memperluas visi Anda tentang cara kerja memori dan pengumpul sampah, jadi baca saja dan temukan sesuatu yang baru untuk diri Anda sendiri :) Ayo pergi! Hal pertama yang perlu Anda ingat adalah bahwa pengumpul sampah bekerja secara paralel dengan program Anda. Ini bukan bagian dari program Anda. Ini berjalan secara terpisah (dalam pelajaran terakhir, kami membandingkan ini dengan penyedot debu robot) Tapi tidak selalu demikian. Pengumpulan sampah biasanya dilakukan di utas yang sama dengan program Anda. Pada beberapa jadwal (setiap beberapa menit sekali), pengumpul sampah akan memeriksa keberadaan objek yang tidak diinginkan dalam program. Masalahnya adalah program akan hang (tidak dijalankan) selama pemeriksaan dan pengumpulan sampah ini. Bayangkan Anda sedang duduk di kantor Anda di tempat kerja. Tapi kemudian wanita pembersih datang untuk mencuci lantai. Dia mengusir Anda dari komputer Anda selama 5 menit dan Anda menunggu sampai dia selesai membersihkan. Selama waktu ini, Anda tidak dapat bekerja. Begitulah cara kerja pengumpulan sampah dulu :) Mekanisme ini kemudian diubah, dan sekarang pengumpul sampah berjalan di latar belakang, tidak menghambat kerja dari program itu sendiri. Anda sudah tahu bahwa sebuah objek mati ketika tidak lagi memiliki referensi. Pada kenyataannya,pengumpul sampah tidak menghitung referensi objek . Pertama, ini bisa memakan waktu lama. Kedua, itu tidak terlalu efektif. Lagi pula, objek bisa merujuk satu sama lain! Lebih lanjut tentang pengumpul sampah - 2Gambar tersebut menunjukkan contoh di mana 3 objek merujuk satu sama lain, tetapi tidak ada orang lain yang merujuknya. Dengan kata lain, program lainnya tidak membutuhkannya. Jika pengumpul sampah hanya menghitung referensi, 3 objek ini tidak akan dikumpulkan dan memori tidak akan dibebaskan (ada referensi untuk mereka!). Kita bisa membandingkan ini dengan pesawat luar angkasa. Selama penerbangan, para astronot memutuskan untuk memeriksa daftar suku cadang yang tersedia untuk diperbaiki. Antara lain, mereka menemukan setir dan pedal dari mobil biasa. Jelas, mereka tidak diperlukan di sini dan menghabiskan ruang yang tidak perlu (meskipun kedua bagian ini terkait satu sama lain dan memiliki beberapa fungsi). Tapi di dalam pesawat luar angkasa, mereka adalah sampah tak berguna yang harus dibuang. Oleh karena itu, di Jawa pengambilan keputusan pengambilan sampah dilakukan bukan berdasarkan penghitungan referensi,terjangkau dan tidak terjangkau . Bagaimana kita menentukan apakah suatu objek dapat dijangkau? Itu semua hanya cerdik. Suatu objek dapat dijangkau jika direferensikan oleh objek lain yang dapat dijangkau. Jadi, kami mendapatkan "rantai keterjangkauan". Itu dimulai saat program dimulai dan berlanjut selama durasi program. Ini terlihat seperti ini: Lebih lanjut tentang pengumpul sampah - 3 Panah pada gambar menunjukkan kode program kami yang dapat dieksekusi. Kode (misalnya, main()metode) membuat referensi ke objek. Objek-objek ini bisa merujuk ke objek lain, objek itu ke objek lain, dan seterusnya. Ini membentuk rantai referensi. Jika Anda dapat melacak rantai dari objek ke "referensi root" (yang dibuat langsung dalam kode yang dapat dieksekusi), maka itu dianggap dapat dijangkau. Objek seperti itu ditandai hitam pada gambar. Tetapi sebuah objek tidak dapat dijangkau jika objek tersebut keluar dari rantai ini, yaitu tidak ada variabel dalam kode yang saat ini sedang dieksekusi yang mereferensikannya, dan objek tersebut tidak dapat dijangkau melalui "rantai referensi". Dalam program kami, dua objek tersebut ditandai dengan warna merah. Perhatikan bahwa objek "merah" ini memiliki referensi satu sama lain. Tapi seperti yang kami katakan sebelumnya, pengumpul sampah modern Java tidak menghitung referensi. Ini menentukan apakah suatu objek dapat dijangkau atau tidak terjangkau. Akibatnya, ia akan menangkap dua benda merah pada gambar. Sekarang mari kita lihat keseluruhan proses dari awal hingga akhir. Dalam melakukannya, kita juga akan melihat bagaimana memori diatur dalam Java :) Semua objek Java disimpan dalam area memori khusus yang disebut heap . Dalam bahasa sehari-hari, tumpukan biasanya adalah segunung barang, di mana semuanya bercampur. Tapi bukan itu tumpukan di Jawa. Strukturnya sangat logis dan masuk akal. Pada titik tertentu, pemrogram Java menemukan bahwa semua objek mereka dapat dibagi menjadi dua jenis: objek sederhana dan "objek berumur panjang".. "Objek berumur panjang" adalah objek yang selamat dari banyak putaran pengumpulan sampah. Mereka biasanya hidup sampai program berakhir. Pada akhirnya, tumpukan penuh, tempat semua objek disimpan, dibagi menjadi beberapa bagian. Bagian pertama memiliki nama yang indah: eden(dari "Taman Eden" alkitabiah). Nama ini cocok, karena di sinilah objek berakhir setelah dibuat. Ini adalah bagian dari memori tempat objek baru dibuat saat kita menggunakan kata kunci baru. Banyak objek dapat dibuat. Saat area ini kehabisan ruang, pengumpulan sampah "cepat" awal dimulai. Kita harus mengatakan bahwa pemulung sangat pintar. Itu memilih algoritma berdasarkan apakah tumpukan memiliki lebih banyak sampah atau lebih banyak objek hidup. Jika hampir semua objek adalah sampah, kolektor menandai objek hidup dan memindahkannya ke area memori lain. Kemudian area saat ini benar-benar dibersihkan. Jika tidak banyak sampah, dan tumpukan sebagian besar adalah objek hidup, pengumpul menandai sampah, membersihkannya, dan mengemas objek lainnya menjadi satu. Kami berkata "ruang bertahan hidup . Ruang bertahan hidup , pada gilirannya, dibagi menjadi beberapa generasi . Setiap objek milik generasi tertentu, tergantung pada berapa banyak putaran pengumpulan sampah yang bertahan. Jika sebuah objek selamat dari satu putaran pengumpulan sampah, maka objek tersebut berada di "Generasi 1"; jika 5, maka "Generasi 5". Bersama-sama, Eden dan ruang bertahan hidup membentuk sebuah wilayah yang disebut generasi muda . Selain generasi muda, heap memiliki area memori lain yang disebut generasi tua. Ini tepatnya area di mana benda-benda berumur panjang yang selamat dari banyak putaran pengumpulan sampah berakhir. Ada keuntungan untuk memisahkan mereka dari yang lainnya. Pengumpulan sampah penuh dilakukan hanya ketika generasi lama penuh, yaitu ada begitu banyak objek berumur panjang dalam program sehingga tidak ada cukup memori. Proses ini melibatkan lebih dari satu area memori. Secara umum, ini melibatkan semua objek yang dibuat oleh mesin Java. Secara alami, ini membutuhkan lebih banyak waktu dan sumber daya. Inilah tepatnya keputusan dibuat untuk menyimpan objek berumur panjang secara terpisah. "Pengumpulan sampah cepat" dilakukan ketika area lain kehabisan ruang. Ini hanya melibatkan satu area, yang membuatnya lebih cepat dan lebih efisien. Akhirnya, bahkan ketika area untuk benda berumur panjang terisi penuh, pengumpulan sampah penuh dipicu. Jadi, kolektor menggunakan alat "terberat" hanya jika tidak mungkin menghindarinya. Berikut representasi visual dari struktur tumpukan dan pengumpulan sampah: Lebih lanjut tentang pengumpul sampah - 4
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION