Go ne tür bir Çöp Toplama kullanıyor?


111

Go, çöp toplama dilidir:

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

Burada, bunun bir işaret ve süpür çöp toplayıcısı olduğunu söylüyor, ancak ayrıntılara girmiyor ve işlerde bir değiştirme var ... yine de, bu paragraf Go piyasaya sürüldüğünden beri pek güncellenmemiş görünüyor.

Hâlâ işaretle ve süpür mü? Muhafazakar mı yoksa kesin mi? Nesil mi?


2
Go çöp toplayıcısının Temmuz 2018'e kadarki
Wildcard

Yanıtlar:


117

Go 1.4+ çöp toplayıcı planları:

  • karma dünyayı durdur / eşzamanlı toplayıcı
  • dünyayı durdurma bölümü 10 ms süre ile sınırlıdır
  • Eşzamanlı toplayıcıyı çalıştırmaya adanmış CPU çekirdekleri
  • üç renkli mark ve süpür algoritması
  • olmayan nesiller
  • olmayan sıkıştırma
  • tamamen hassas
  • Program işaretçileri hareket ettiriyorsa küçük bir maliyete neden olur
  • daha düşük gecikme, ancak büyük olasılıkla Go 1.3 GC'den daha düşük verim

Go 1.1'in üstüne 1.3 çöp toplayıcı güncellemelerine gidin:

  • eşzamanlı süpürme (daha kısa duraklama sürelerine neden olur)
  • tamamen hassas

1.1 çöp toplayıcıya gidin:

  • mark-and-sweep (paralel uygulama)
  • olmayan nesiller
  • olmayan sıkıştırma
  • çoğunlukla kesin (yığın çerçeveler hariç)
  • dünyayı Durdur
  • bitmap tabanlı gösterim
  • program bellek ayırmadığında sıfır maliyet (yani: işaretçileri karıştırmak C'deki kadar hızlıdır, ancak pratikte bu C'den biraz daha yavaş çalışır çünkü Go derleyicisi GCC gibi C derleyicileri kadar gelişmiş değildir)
  • nesnelerde sonlandırıcıları destekler
  • zayıf referanslar için destek yok

1.0 çöp toplayıcıya gidin:

  • Go 1.1 ile aynıdır, ancak çoğunlukla kesin olmak yerine, çöp toplayıcı tutucudur. Konservatif GC, [] bayt gibi nesneleri yok sayabilir.

GC'yi farklı bir tanesiyle değiştirmek tartışmalıdır, örneğin:

  • çok büyük yığınlar dışında, nesilsel bir GC'nin genel olarak daha hızlı olup olmayacağı belirsizdir.
  • "güvenli olmayan" paket, tamamen hassas GC ve sıkıştırma GC'yi uygulamayı zorlaştırır

Ayrıca mevcut çöp toplayıcı, çok çekirdekli sistemlerde daha hızlı çalışabilmesi için belirli bir paralelliğe sahiptir.
uriel

3
@uriel: Evet, cevabımın 1. maddesinde bundan bahsetmiştim - "(paralel uygulama)" metni.

Bu cevap hala güncel mi?
Kim Stebel

c # çöp toplayıcı
kesindir

3
İyi bir geçmiş günlüğü oluşturmak için bu yanıtı 1.5.x ile güncellemeye ne dersiniz?
Ismael

32

( Go 1.8 - Q1 2017 için aşağıya bakın )

Bir sonraki Go 1.5 eşzamanlı Çöp Toplayıcı, söz konusu gc'yi "hızlandırmayı" içerir.
İşte bu makalede sunulan ve Go 1.5 için uygun olabilecek, ancak aynı zamanda Go'daki gc'yi anlamaya yardımcı olacak bir öneri .

Sen devlet görebilirsiniz önce (: STW Stop The Dünyası) 1.5

Go 1.5'ten önce Go, paralel bir dünyayı durdur (STW) toplayıcı kullanıyordu.
STW toplama birçok dezavantaja sahipken, en azından tahmin edilebilir ve kontrol edilebilir yığın büyüme davranışına sahiptir.

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

( GopherCon 2015 sunumundan fotoğraf " Go GC: Go 1.5'te Gecikme Sorununu Çözme ")

STW toplayıcı için tek ayar düğmesi, koleksiyonlar arasındaki göreceli yığın büyümesi olan "GOGC" idi. Varsayılan ayar olan% 100, önceki koleksiyondan itibaren yığın boyutu canlı yığın boyutunun iki katına çıktığında çöp toplamayı tetikledi:

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

STW toplayıcısında GC zamanlaması.

Go 1.5, eşzamanlı bir toplayıcı sunar .
Bunun STW toplamaya göre birçok avantajı vardır, ancak yığın büyümesini kontrol etmek daha zordur çünkü uygulama, çöp toplayıcı çalışırken bellek ayırabilir .

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

( GopherCon 2015 sunumundan fotoğraf " Go GC: Go 1.5'te Gecikme Sorununu Çözme ")

Aynı yığın büyüme sınırını elde etmek için çalışma zamanının çöp toplamaya daha erken başlaması gerekir, ancak ne kadar erken olursa, çoğu tahmin edilemeyen birçok değişkene bağlıdır.

  • Toplayıcıyı çok erken başlatırsanız, uygulama çok fazla çöp toplama işlemi gerçekleştirecek ve CPU kaynaklarını boşa harcayacaktır.
  • Toplayıcıyı çok geç başlatın ve uygulama istenen maksimum yığın büyümesini aşacaktır.

Eşzamanlılıktan ödün vermeden doğru dengeyi elde etmek, çöp toplayıcının hızını dikkatlice ayarlamayı gerektirir.

GC hızı, iki boyutta optimizasyonu hedefler: yığın büyümesi ve çöp toplayıcı tarafından kullanılan CPU.

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

GC hızının tasarımı dört bileşenden oluşur:

  1. bir GC döngüsünün gerektireceği tarama işi miktarı için bir tahmin edici,
  2. Yığın tahsisi yığın hedefine ulaştığında, mutatörlerin tahmini tarama işi miktarını gerçekleştirmesi için bir mekanizma,
  3. mutatör CPU bütçesini yetersiz kullandığında arka plan taraması için bir programlayıcı ve
  4. GC tetikleyicisi için orantılı bir kontrolör.

Tasarım, iki farklı zaman görünümünü dengeler : CPU zamanı ve yığın zamanı .

  • CPU zamanı , standart duvar saati zamanı gibidir, ancak GOMAXPROCSzamanları daha hızlı geçer .
    Yani, GOMAXPROCS8 ise , her duvarda sekiz CPU saniyesi geçer ve GC her duvar saniyesinde iki saniyelik CPU süresi alır.
    CPU zamanlayıcı, CPU süresini yönetir.
  • Yığın süresinin geçişi bayt cinsinden ölçülür ve mutatörler tahsis ettikçe ileri doğru hareket eder.

Yığın süresi ile duvar süresi arasındaki ilişki, tahsis oranına bağlıdır ve sürekli değişebilir.
Mutator, yığın süresinin geçişini yönetmeye yardımcı olur ve tahmini tarama çalışmasının, yığın hedef boyutuna ulaştığında tamamlanmasını sağlar.
Son olarak, tetikleyici denetleyici, bu iki zaman görünümünü birbirine bağlayan ve hem yığın zamanı hem de CPU zaman hedefleri için optimize eden bir geri bildirim döngüsü oluşturur.


20

Bu, GC'nin uygulanmasıdır:

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

Kaynaktaki belgelerden:

GC, mutatör ipliklerle eşzamanlı olarak çalışır, tipe duyarlıdır (diğer adıyla hassas), birden fazla GC ipliğinin paralel olarak çalışmasına izin verir. Bir yazma engeli kullanan eşzamanlı bir işaret ve süpürmedir. Nesilsel değildir ve sıkıştırılamaz. Tahsisat, ortak durumda kilitleri ortadan kaldırırken parçalanmayı en aza indirmek için P tahsis alanları başına ayrılmış boyut kullanılarak yapılır.


8

Go 1.8 GC, "STW yığınını yeniden taramayı ortadan kaldır" önerisiyle yeniden gelişebilir

Go 1.7'den itibaren, sınırsız ve potansiyel olarak önemsiz olmayan dünyayı durdurma (STW) süresinin kalan kaynağı yığın yeniden taramadır.

Yuasa tarzı silme yazma engeli [Yuasa '90] ve Dijkstra tarzı ekleme yazma engelini [Dijkstra '78] birleştiren karma bir yazma engeline geçerek yığın yeniden tarama ihtiyacını ortadan kaldırmayı öneriyoruz .

Ön deneyler, bunun en kötü durum STW süresini 50µs'nin altına düşürebileceğini ve bu yaklaşımın STW işareti sonlandırmasının tamamen ortadan kaldırılmasını pratik hale getirebileceğini göstermektedir.

Duyuru burada ve ilgili kaynak taahhüt görebilirsiniz olduğu d70b0fe ve önceki.


3

Emin değilim, ancak mevcut (ipucu) GC'nin zaten paralel veya en azından bir WIP olduğunu düşünüyorum. Dolayısıyla dünyayı durdurma mülkiyeti artık geçerli değil veya yakın gelecekte olmayacak. Belki bir başkası bunu daha ayrıntılı olarak açıklayabilir.


7
Bu dünyayı durdurur. GC potansiyel olarak dünya durdurulduktan sonra paralel olarak çalışır. Muhtemelen eşzamanlı GC demek istediniz.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.