it-swarm-id.com

Koleksi Sampah seperti apa yang digunakan Go?

Go adalah bahasa sampah yang dikumpulkan:

http://golang.org/doc/go_faq.html#garbage_collection

Di sini dikatakan bahwa ini adalah pengumpul sampah tanda-dan-sapu, tetapi tidak menyelidiki detailnya, dan penggantinya sedang dikerjakan ... namun, paragraf ini tampaknya tidak terlalu banyak diperbarui sejak Go dirilis.

Masih tanda dan sapuan? Apakah ini konservatif atau tepat? Apakah ini generasi?

102
user1003432

Paket untuk Go 1.4+ pemulung:

  • kolektor stop-the-world/concurrent hybrid
  • bagian stop-the-world dibatasi oleh tenggat waktu 10 ms
  • Inti CPU yang didedikasikan untuk menjalankan kolektor bersamaan
  • algoritma tanda-dan-sapuan tri-warna
  • non-generasi
  • non-kompaksi
  • sepenuhnya tepat
  • dikenakan biaya kecil jika program ini memindahkan pointer di sekitar
  • latensi yang lebih rendah, tetapi kemungkinan besar juga throughput yang lebih rendah, daripada Go 1.3 GC

Go 1.3 pembaruan pengumpul sampah di atas Go 1.1:

  • sapuan bersamaan (menghasilkan waktu jeda yang lebih kecil)
  • sepenuhnya tepat

Go 1.1 pengumpul sampah:

  • mark-and-sweep (implementasi paralel)
  • non-generasi
  • non-kompaksi
  • sebagian besar tepat (kecuali tumpukan frame)
  • stop-the-world
  • representasi berbasis bitmap
  • nol-biaya ketika program tidak mengalokasikan memori (yaitu: pengocokan shuffling pointer di sekitar secepat di C, meskipun dalam praktiknya ini berjalan agak lebih lambat daripada C karena kompiler Go tidak semaju C kompiler seperti GCC)
  • mendukung finalizer pada objek
  • tidak ada dukungan untuk referensi yang lemah

Go 1.0 pengumpul sampah:

  • sama seperti Go 1.1, tetapi alih-alih sebagian besar tepat, pengumpul sampah adalah konservatif. GC konservatif dapat mengabaikan objek seperti [] byte.

Mengganti GC dengan yang berbeda masih kontroversial, misalnya:

  • kecuali untuk tumpukan yang sangat besar, tidak jelas apakah GC generasi akan lebih cepat secara keseluruhan
  • paket "tidak aman" membuatnya sulit untuk menerapkan GC yang sepenuhnya tepat dan memadatkan GC
109
user811773

(Untuk Go 1.8 - Q1 2017, lihat di bawah )

Go 1.5 berikutnya bersamaan Pengumpul Sampah melibatkan kemampuan untuk "mempercepat" kata gc.
Berikut adalah proposal yang disajikan dalam makalah ini yang mungkin membuatnya untuk Go 1.5, tetapi juga membantu memahami gc di Go.

Anda dapat melihat status sebelum 1.5 (Stop The World: STW)

Sebelum Go 1.5, Go telah menggunakan kolektor stop-the-world paralel (STW).
Meskipun koleksi STW memiliki banyak kerugian, setidaknya koleksi ini memiliki perilaku pertumbuhan tumpukan yang dapat diprediksi dan dapat dikendalikan.

https://40.media.tumblr.com/49e6556b94d75de1050c62539680fcf9/tumblr_inline_nr6qq8D9FE1sdck2n_540.jpg

(Foto dari GopherCon 2015 presentasi " Go GC: Memecahkan Masalah Latensi di Go 1.5 " )

Satu-satunya tombol tala untuk kolektor STW adalah "GOGC", pertumbuhan tumpukan relatif antara koleksi. Pengaturan default, 100%, memicu pengumpulan sampah setiap kali ukuran tumpukan naik dua kali lipat dari ukuran tumpukan langsung pada koleksi sebelumnya:

https://docs.google.com/drawings/image?id=sLJ_JvGfPfPnojLlEGLCWkw&rev=1&h=113&w=424&ac=1

Waktu GC dalam kolektor STW.

Go 1.5 memperkenalkan kolektor bersamaan .
Ini memiliki banyak keunggulan dibandingkan pengumpulan STW, tetapi ini m membuat pertumbuhan tumpukan lebih sulit untuk dikendalikan karena aplikasi dapat mengalokasikan memori saat pengumpul sampah berjalan .

https://40.media.tumblr.com/783c6e557b427a5c023520578740eb94/tumblr_inline_nr6qqpmaJx1sdck2n_540.jpg

(Foto dari GopherCon 2015 presentasi " Go GC: Memecahkan Masalah Latensi di Go 1.5 " )

Untuk mencapai batas pertumbuhan tumpukan yang sama, runtime harus memulai pengumpulan sampah lebih awal, tetapi seberapa jauh sebelumnya tergantung pada banyak variabel, banyak di antaranya tidak dapat diprediksi.

  • Mulai kolektor terlalu dini, dan aplikasi akan melakukan terlalu banyak pengumpulan sampah, membuang-buang sumber daya CPU.
  • Mulai kolektor terlambat, dan aplikasi akan melebihi pertumbuhan tumpukan maksimum yang diinginkan.

Mencapai keseimbangan yang tepat tanpa mengorbankan konkurensi membutuhkan langkah yang hati-hati terhadap pengumpul sampah.

GC pacing bertujuan untuk mengoptimalkan sepanjang dua dimensi: pertumbuhan tumpukan, dan CPU yang digunakan oleh pengumpul sampah.

https://docs.google.com/drawings/image?id=sEZYCf7Mc0E0EGmy4gho3_w&rev=1&h=235&w=457&ac=1

Desain pacing GC terdiri dari empat komponen:

  1. penaksir untuk jumlah pekerjaan pemindaian siklus GC akan membutuhkan,
  2. mekanisme bagi mutator untuk melakukan perkiraan jumlah pekerjaan pemindaian pada saat alokasi tumpukan mencapai tujuan tumpukan,
  3. scheduler untuk pemindaian latar belakang ketika mutator membantu kurang memanfaatkan anggaran CPU, dan
  4. pengontrol proporsional untuk pemicu GC.

Saldo desain dua tampilan waktu yang berbeda: waktu CPU dan waktu tumpukan .

  • Waktu CPU seperti waktu jam dinding standar, tetapi melewati GOMAXPROCS kali lebih cepat.
    Yaitu, jika GOMAXPROCS adalah 8, maka delapan detik CPU melewati setiap detik dinding dan GC mendapat dua detik waktu CPU setiap dinding detik.
    Penjadwal CPU mengelola waktu CPU.
  • Bagian dari waktu tumpukan diukur dalam byte dan bergerak maju sebagai mutator mengalokasikan.

Hubungan antara waktu tumpukan dan waktu dinding tergantung pada tingkat alokasi dan dapat berubah secara konstan.
Mutator membantu mengelola berlalunya waktu tumpukan, memastikan pekerjaan pemindaian yang diperkirakan telah selesai pada saat tumpukan mencapai ukuran sasaran.
Akhirnya, pengontrol pemicu membuat loop umpan balik yang mengikat kedua pandangan waktu ini bersama-sama, mengoptimalkan untuk kedua timbunan dan tujuan waktu CPU.

31
VonC

Ini adalah implementasi dari GC:

https://github.com/golang/go/blob/master/src/runtime/mgc.go

Dari dokumen di sumber:

GC berjalan bersamaan dengan utas mutator, adalah tipe akurat (alias presisi), memungkinkan beberapa utas GC berjalan secara paralel. Ini adalah tanda dan sapuan bersamaan yang menggunakan penghalang tulis. Ini non-generasi dan non-kompaksi. Alokasi dilakukan dengan menggunakan ukuran yang dipisahkan per area alokasi P untuk meminimalkan fragmentasi sambil menghilangkan kunci dalam kasus umum.

18
berdario

Go 1.8 GC dapat berevolusi lagi, dengan proposal "Eliminate STW stack re-scanning"

Pada Go 1.7, satu-satunya sumber yang tersisa dari stop-the-world (STW) tak terbatas dan berpotensi non-sepele waktu adalah pemindaian ulang tumpukan.

Kami mengusulkan untuk menghilangkan perlunya pemindaian ulang tumpukan dengan beralih ke penghalang tulis hibrid yang menggabungkan penghalang tulis penghapusan gaya Yuasa [Yuasa '90] dan tulis penyisipan gaya Dijkstra-style barrier [Dijkstra '78] .

Eksperimen awal menunjukkan bahwa ini dapat mengurangi waktu STW kasus terburuk hingga di bawah 50 μs, dan pendekatan ini mungkin membuatnya praktis untuk menghilangkan terminasi merek STW secara bersamaan.

Pengumuman ada di sini dan Anda dapat melihat komit sumber yang relevan adalah d70b0fe dan sebelumnya.

8
VonC

Saya tidak yakin, tapi saya pikir GC saat ini sudah paralel atau setidaknya WIP. Dengan demikian properti stop-the-world tidak berlaku lagi atau tidak dalam waktu dekat. Mungkin orang lain dapat mengklarifikasi hal ini secara lebih rinci.

2
jnml