Apa algoritme di balik GC jeda rendah?

12

Beberapa bahasa, misalnya java, memperkenalkan jeda GC yang rendah.

GC itu dapat melakukan sebagian besar pekerjaan tanpa menghentikan seluruh dunia. Ini jelas merupakan masalah yang cukup sulit karena perlu menganalisis memori ketika thread memodifikasinya, menghasilkan data yang dapat digunakan pada awal proses dan tidak lagi ketika selesai, atau data yang tampaknya merupakan sampah tetapi karena referensi dipindahkan dalam memori dan tidak pernah muncul di mana GC sedang mencari.

Jadi pada dasarnya, apa algoritma di balik itu?

Makalah penelitian atau tautan artikel yang benar-benar teknis akan dianggap sebagai jawaban yang valid, karena topik ini benar-benar teknis.

deadalnix
sumber

Jawaban:

16

Jadi pada dasarnya, apa algoritma di balik itu?

Pada dasarnya ini adalah algoritma tanda dan sapuan yang "hanya" berjalan secara bersamaan di utas terpisah.

Adapun makalah penelitian tentang hal itu:

Elang
sumber
5

Sejauh yang saya mengerti, pengumpul sampah Java G1 menggunakan daerah tumpukan yang disebut untuk menghindari menjeda seluruh dunia. Cara saya melihatnya adalah bahwa sementara salah satu wilayah dikunci oleh GC melakukan pembersihan, alokasi memori dilakukan di wilayah lain.

Berikut ini penjelasan dari Jeremy Manson :

Prinsipnya sederhana: kolektor membagi tumpukan menjadi wilayah ukuran tetap dan melacak data langsung di wilayah tersebut. Itu membuat satu set pointer - "set yang diingat" - masuk dan keluar dari wilayah tersebut. Ketika suatu GC dianggap perlu, ia mengumpulkan daerah-daerah dengan lebih sedikit data langsung terlebih dahulu (karenanya, "sampah pertama"). Seringkali, ini bisa berarti mengumpulkan seluruh wilayah dalam satu langkah: jika jumlah pointer ke suatu daerah adalah nol, maka itu tidak perlu melakukan tanda atau menyapu daerah itu ...

agas
sumber
5

JVM real-time IBM menggunakan pengumpul sampah yang disebut Metronome yang memecah aktivitas GC menjadi quanta diskrit dan menyatukannya dengan pemrosesan aplikasi. Jadi pada dasarnya alih-alih GC dunia berhenti (dan non-deterministik) berhenti, aplikasi malah berjalan sedikit lebih lambat sementara GC dilakukan secara paralel.

Ada GC lain yang melakukan defragmentasi dinamis dan memenuhi persyaratan waktu nyata, tetapi satu-satunya referensi yang dapat saya temukan ada di sini (diperlukan keanggotaan ACM).

Seorang kolektor sampah real-time bersamaan yang menarik tidak ada habisnya . Ini menggunakan pendekatan mark-and-sweep tradisional, tetapi dirancang untuk digunakan pada sistem multiprosesor dan mendukung multithreading bersamaan bebas-penguncian.

TMN
sumber
Bagus! Sayang sekali saya tidak memiliki akses ke ACM, artikel ini terlihat sangat menarik.
deadalnix
2

Alasan kerjanya adalah karena di Jawa, hanya GC yang dapat membebaskan memori yang mungkin berisi referensi GC. Itu berarti bahwa selama Anda dapat membaca objek dalam utas terpisah dengan aman, Anda hanya perlu menghentikan sementara program untuk mengamati referensi pada tumpukan.

Saya akan menyarankan mutasi agar mereka menerapkan beberapa bentuk copy-on-write untuk menginformasikan kepada GC tentang perubahan tersebut.

DeadMG
sumber
Itu tidak cukup selama referensi mereka dapat diperbarui kapan saja oleh utas apa pun.
deadalnix