Internal Pengumpul Sampah
Mark-sweep tiga warna, GOGC, dan jeda GC
Internal Pengumpul Sampah adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
Tanda-dan-sapu tiga warna
Pengumpul sampah Go menggunakan algoritme tanda-dan-sapu tiga warna secara serentak. Objek berwarna putih (belum dikunjungi), abu-abu (ditemukan tetapi anaknya belum dipindai), atau hitam (telah dipindai sepenuhnya). Objek putih menjadi sampah saat penyapuan.
Pengumpulan sampah serentak
Pengumpul sampah Go sebagian besar berjalan secara serentak dengan goroutine aplikasi. Hal ini mengurangi jeda stop-the-world (STW) menjadi durasi di bawah satu milidetik pada sebagian besar program.
Penghalang penulisan
Penghalang penulisan mencegat penulisan penunjuk selama fase penandaan serentak untuk mempertahankan invarian bahwa objek hitam tidak menunjuk ke objek putih. Penghalang ini menambahkan sedikit beban pada setiap penulisan penunjuk.
Fase STW
Dua jeda STW singkat pada setiap siklus pengumpulan: (1) penyiapan penandaan (mengaktifkan penghalang penulisan, mengambil snapshot stack goroutine), (2) penghentian penandaan (memastikan semua objek abu-abu telah dipindai). P99 biasanya <1md.
GOGC
Pemicu pengumpulan sampah dikendalikan oleh GOGC (bawaan 100). Artinya, "jalankan pengumpulan sampah saat ukuran heap aktif menjadi dua kali lipat dari pengumpulan sebelumnya." Menetapkan GOGC=50 memicu pengumpulan sampah lebih sering dengan penggunaan memori lebih kecil; GOGC=200 memicu pengumpulan sampah lebih jarang dengan penggunaan memori lebih besar.
GOMEMLIMIT
GOMEMLIMIT (Go 1.19+) menetapkan batas memori lunak. Saat memori heap mendekati batas tersebut, GC berjalan lebih agresif terlepas dari GOGC. Gunakan ini untuk mencegah proses dihentikan oleh OOM di lingkungan dengan keterbatasan memori.
import "runtime/debug"
debug.SetMemoryLimit(512 * 1024 * 1024)Pengaturan Laju
GC mengatur lajunya sendiri agar penandaan selesai sebelum heap penuh sesuai dengan GOGC. Jika laju alokasi tinggi, GC menambah jumlah goroutine yang membantu proses penandaan (bantuan penandaan).
runtime.GC()
Memanggil runtime.GC() memaksa siklus GC segera berjalan. Ini berguna dalam test untuk memastikan finalizer berjalan, atau dalam tolok ukur agar dimulai dengan heap yang bersih. Jangan memanggilnya dalam produksi.
Finalizer
Daftarkan fungsi untuk dijalankan saat sebuah objek dikumpulkan oleh garbage collector dengan runtime.SetFinalizer. Finalizer berjalan dalam goroutine khusus setelah GC. Hindari penggunaannya untuk pembersihan sumber daya—gunakan metode Close() sebagai gantinya.
Metrik GC
Baca statistik GC dari runtime.ReadMemStats atau tampilkan melalui metrik Prometheus. Fields penting: NumGC, PauseNs, HeapAlloc, HeapInuse.
var m runtime.MemStats
runtime.ReadMemStats(&m)
fmt.Printf("GC cycles: %d, last pause: %dns\n", m.NumGC, m.PauseNs[(m.NumGC+255)%256])Pengembali Memori
Pengembali memori di latar belakang mengembalikan memori heap yang tidak digunakan ke OS. Proses ini berjalan secara bersamaan dan diatur agar tidak memengaruhi performa proses utama. Panggilan sistem MADV_FREE atau MADV_DONTNEED digunakan.
Pemeriksaan Cepat
Apa yang dilakukan GOMEMLIMIT dalam Go 1.19+?
Rangkuman: Internal GC
Poin penting:
- Penandaan-dan-penyapuan tiga warna secara bersamaan; dua jeda STW singkat
- GOGC mengendalikan rasio pertumbuhan heap; nilai bawaan 100 (pertumbuhan 100% memicu GC)
- GOMEMLIMIT untuk keamanan memori kontainer (Go 1.19+)
- runtime.ReadMemStats untuk metrik GC
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Internal Pengumpul Sampah” gratis?
Ya — teks lengkap “Internal Pengumpul Sampah” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Internal Pengumpul Sampah”?
Mark-sweep tiga warna, GOGC, dan jeda GC Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Internal Pengumpul Sampah” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Stack vs Heap dan Analisis Escape
- Model Memori Go dan Happens-Before
- Internal Pengumpul Sampah
- Mengurangi Alokasi: sync.Pool dan Arena