Apakah pengumpul sampah generasi pada dasarnya ramah terhadap cache?


38

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?


diskusi meta terkait tentang tag yang sesuai untuk pertanyaan tersebut.
Kaveh

Jawaban:


19

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.


10

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.


Jadi Anda bisa berargumen bahwa GC generasi ramah cache dibandingkan dengan yang non-generasi (klasik)?
Raphael

Saya berpendapat bahwa GC harus dirancang secara terintegrasi dengan cache & memori virtual sebagai bagian dari desainnya, yang rumit dalam arsitektur yang ada. namun untuk memperluas jawabannya-- ya kolektor generasi mengagregasi / menghibur / mengelompokkan objek yang sering digunakan menjadi memori yang bersebelahan yang secara inheren lebih kompatibel dengan cache daripada desain lain di mana objek yang sering dan jarang digunakan tersebar / dicampur (meskipun yang terakhir masih akan memiliki beberapa manfaat cache).
vzn

1
Salah satu aspek yang agak rumit dari menggabungkan arsitektur GC dan caching / virtualisasi adalah bahwa arsitektur seperti itu umumnya tidak peduli dengan isi halaman memori, tetapi dalam sistem GC mereka diharuskan. Bahasa yang berbeda kadang-kadang menjanjikan fitur terkait GC yang berbeda untuk programmer, dan mencari tahu fitur mana yang didukung pada tingkat OS mungkin sulit. Pendekatan terbaik mungkin akan mengatakan bahwa setiap objek perlu berisi pointer ke struktur yang bidang awalnya ditentukan oleh OS, tetapi yang mungkin diikuti oleh data khusus bahasa yang tidak akan diketahui atau dipedulikan oleh OS.
supercat
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.