(Untuk Go 1.8 - Q1 2017, lihat di bawah )
Pengumpul Sampah serentak Go 1.5 berikutnya melibatkan kemampuan untuk "memacu" kata gc.
Berikut adalah proposal yang disajikan dalam makalah ini yang mungkin cocok untuk Go 1.5, tetapi juga membantu memahami GC di Go.
Anda dapat melihat keadaan sebelum 1,5 (Stop The World: STW)
Sebelum Go 1.5, Go telah menggunakan pengumpul stop-the-world (STW) paralel .
Meskipun koleksi STW memiliki banyak kelemahan, koleksi STW setidaknya memiliki perilaku pertumbuhan heap yang dapat diprediksi dan dikontrol.
(Foto dari presentasi GopherCon 2015 " Go GC: Memecahkan Masalah Latensi di Go 1.5 ")
Tombol tuning tunggal untuk kolektor STW adalah "GOGC", pertumbuhan heap relatif antar koleksi. Setelan default, 100%, memicu pengumpulan sampah setiap kali ukuran heap menjadi dua kali lipat dari ukuran live heap seperti pada koleksi sebelumnya:
Pengaturan waktu GC di kolektor STW.
Go 1.5 memperkenalkan kolektor bersamaan .
Ini memiliki banyak keuntungan dibandingkan kumpulan STW, tetapi ini membuat pertumbuhan heap lebih sulit dikendalikan karena aplikasi dapat mengalokasikan memori saat pengumpul sampah sedang berjalan .
(Foto dari presentasi GopherCon 2015 " Go GC: Memecahkan Masalah Latensi di Go 1.5 ")
Untuk mencapai batas pertumbuhan heap yang sama, runtime harus memulai pengumpulan sampah lebih awal, tetapi seberapa jauh sebelumnya bergantung pada banyak variabel, banyak di antaranya tidak dapat diprediksi.
- Mulai pengumpul terlalu dini, dan aplikasi akan melakukan terlalu banyak pengumpulan sampah, membuang sumber daya CPU.
- Mulailah pengumpul terlambat, dan aplikasi akan melebihi pertumbuhan heap maksimum yang diinginkan.
Mencapai keseimbangan yang tepat tanpa mengorbankan konkurensi membutuhkan pemindahan sampah yang cermat.
Penentuan tempo GC bertujuan untuk mengoptimalkan dua dimensi: pertumbuhan heap, dan CPU yang digunakan oleh pengumpul sampah.
Desain pacu GC terdiri dari empat komponen:
- penaksir untuk jumlah pekerjaan pemindaian yang diperlukan siklus GC,
- mekanisme bagi mutator untuk melakukan perkiraan jumlah pekerjaan pemindaian pada saat alokasi heap mencapai tujuan heap,
- penjadwal untuk pemindaian latar belakang ketika mutator membantu kurang memanfaatkan anggaran CPU, dan
- pengontrol proporsional untuk pemicu GC.
Desainnya menyeimbangkan dua tampilan waktu yang berbeda: waktu CPU dan waktu heap .
- Waktu CPU seperti waktu jam dinding standar, tetapi melewati
GOMAXPROCS
waktu lebih cepat.
Artinya, jika GOMAXPROCS
8, maka delapan detik CPU melewati setiap detik dinding dan GC mendapat dua detik waktu CPU setiap detik.
Penjadwal CPU mengatur waktu CPU.
- Perjalanan waktu heap diukur dalam byte dan bergerak maju saat mutator mengalokasikan.
Hubungan antara waktu heap dan waktu dinding bergantung pada tingkat alokasi dan dapat berubah secara konstan.
Mutator membantu mengelola perjalanan waktu heap, memastikan perkiraan pekerjaan pemindaian telah diselesaikan pada saat heap mencapai ukuran tujuan.
Terakhir, pengontrol pemicu membuat loop umpan balik yang menghubungkan kedua tampilan waktu ini bersama-sama, mengoptimalkan waktu heap dan tujuan waktu CPU.