Seorang pengumpul sampah generasi biasa menyimpan data yang dialokasikan baru-baru ini di wilayah memori yang terpisah. Dalam program tipikal, banyak data berumur pendek, sehingga mengumpulkan sampah muda (siklus GC minor) sering dan mengumpulkan sampah lama jarang merupakan kompromi yang baik antara overhead memori dan waktu yang dihabiskan untuk melakukan GC.
Secara intuitif, manfaat pengumpul sampah generasi dibandingkan dengan pengumpul wilayah tunggal harus meningkat karena rasio latensi memori utama relatif terhadap peningkatan cache, karena data di wilayah muda sering diakses dan disimpan di satu tempat. Apakah hasil eksperimen menguatkan intuisi ini?
programming-languages
computer-architecture
cpu-cache
garbage-collection
Gilles 'SANGAT berhenti menjadi jahat'
sumber
sumber
Jawaban:
Berikut adalah beberapa makalah yang membahas tentang implikasi cache dari pengumpul sampah generasi:
Dari apa yang saya dapat kumpulkan, masalah utama adalah bahwa sistem pengumpulan sampah memperdagangkan ruang dalam memori untuk menghindari pengumpulan di muka. Hal yang sama berlaku untuk memori cache. Seperti yang Anda sarankan, hal-hal dalam generasi pertama kemungkinan besar akan berada di cache, dan alokasi dan koleksi mereka akan jauh lebih cepat daripada sesuatu di memori utama, atau dipindahkan ke disk. Masalah utama adalah ukuran generasi pertama sehubungan dengan ukuran cache Anda. Jika cache Anda terisi sebelum generasi pertama melakukannya, maka Anda mulai kehilangan manfaat itu ketika kesalahan mulai menumpuk.
sumber
Ada aspek yang sangat rumit dari semua pemulung yang mungkin terpoles dalam beberapa deskripsi, dan itu adalah "pemindaian penuh" atau "pemungutan penuh". Secara berkala, secara acak, sesekali mereka harus memindai semua objek. pengumpul generasi lebih baik dalam menunda pemindaian penuh dan meminimalkan durasinya, tetapi masih diperlukan.
Kolektor generasi akan fokus pada apa yang kadang-kadang disebut ruang "pembibitan", tetapi pada akhirnya / tidak terhindarkan harus mengumpulkan pada ruang generasi "lama", menyebabkan pemindaian penuh memori.
Pemindaian lengkap ini tidak kompatibel dengan hampir semua cache memori dan (terutama!) Skema virtualisasi dalam arti bahwa hampir semua skema cache memori / virtualisasi akan / harus gagal parah dalam setiap peningkatan kinerja dalam kasus ini.
Jadi jawaban kunci untuk pertanyaan ini adalah seberapa sering pemindaian penuh dipicu, dan seberapa "buruk" pengaruhnya ketika terjadi, dan jika dapat ditoleransi. ini bermuara pada properti / pertanyaan yang bergantung pada aplikasi.
Dengan kata lain untuk "sebagian besar" operasi kolektor, cache mungkin akan membantunya (cache dan ruang pembibitan "muda" umumnya akan tumpang tindih!), Tetapi ada periodik, sebentar-sebentar, akhirnya, tak terhindarkan, berat, bahkan mungkin "masif" [merendahkan] lonjakan kinerja ketika ruang "generasi lama" dikumpulkan penuh dan cache "hit rate" akan menurun menjadi sangat buruk karena banyak objek di luar semuanya diambil dalam loop ketat oleh penuh memindai / mengumpulkan siklus. Dengan kata lain, diskontinuitas periodik yang tak terhindarkan (di mana perkiraan statistik / rata-rata / tren kinerja dll menyesatkan dan tidak dapat diterapkan).
Apa yang sekarang muncul adalah beberapa sistem pengumpulan baru yang dirancang untuk menyatu dengan sistem manajemen memori yang mendasarinya (caching / virtualisasi). Tampaknya pendekatan historis yang sepenuhnya memisahkan sistem pengumpulan, penyimpanan, dan virtualisasi memori yang terpisah tidak akan berfungsi sebaik pendekatan yang menggabungkan / mengintegrasikan / mengatasi ketiga aspek bersama-sama.
Lihat mis. Pengumpulan sampah sadar tembolok oleh Zhou dan Demsky.
sumber