Stack vs Heap dan Analisis Escape
Cara Go menentukan lokasi alokasi memori
Stack vs Heap dan Analisis Escape adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 1 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.
Alokasi stack
Variabel lokal yang tidak keluar dari fungsi dialokasikan pada stack goroutine. Alokasi stack berlangsung cepat (hanya menambah penunjuk) dan tidak menimbulkan biaya pengumpulan (bingkai stack dikeluarkan saat fungsi kembali).
Alokasi heap
Variabel yang keluar ke heap dialokasikan oleh alokator Go dan dilacak oleh pengumpul sampah. Alokasi heap lebih lambat dan menambah tekanan pada pengumpulan sampah.
Apa yang menyebabkan pelolosan?
Penyebab umum pelolosan: mengambil alamat variabel lokal lalu mengembalikannya, menyimpan variabel lokal dalam antarmuka, atau mengirimkannya melalui saluran. Analisis pelolosan milik kompilator menentukan hal ini.
func newUser() *User { // *User escapes to heap
return &User{Name: "Alice"}
}go build -gcflags=-m
Tampilkan keputusan analisis pelolosan:
go build -gcflags="-m" .
// main.go:10:15: &User literal escapes to heap
// main.go:5:14: s does not escapeStack goroutine
Setiap goroutine dimulai dengan stack kecil (2 KiB di Go 1.14+) yang tumbuh secara dinamis sesuai kebutuhan. Stack terpisah dari heap dan dikumpulkan ketika goroutine selesai.
Menghindari alokasi
Teruskan nilai, bukan penunjuk, untuk struct kecil. Gunakan larik yang dialokasikan pada stack, bukan slice, jika ukurannya diketahui. Kembalikan nilai, bukan penunjuk, agar nilai tetap berada pada stack.
Pembungkusan antarmuka
Menetapkan nilai konkret ke antarmuka menyebabkan nilai tersebut keluar ke heap (boxing). Untuk jalur yang sering dieksekusi, terima tipe konkret atau gunakan generik, bukan antarmuka.
sync.Pool
Gunakan sync.Pool untuk menggunakan kembali objek yang dialokasikan pada heap dan mengurangi tekanan pengumpulan sampah akibat alokasi objek berumur singkat yang sering dilakukan (buffer, konteks permintaan).
var pool = sync.Pool{New: func() any { return make([]byte, 1024) }}
buf := pool.Get().([]byte)
defer pool.Put(buf[:0])Membuat profil alokasi
Gunakan go test -benchmem dan pembuatan profil heap dengan -alloc_space untuk menemukan fungsi yang mengalokasikan memori paling banyak.
slice vs larik
Larik kecil [N]T mungkin tetap berada pada stack. Header slice (24 byte) dialokasikan pada stack, tetapi larik pendukungnya mungkin keluar. Pra-alokasi dengan make mencegah alokasi ulang berulang.
Internalisasi string
Literal string tidak dialokasikan pada heap (berada di segmen data hanya-baca). Mengubah []byte menjadi string menyebabkan alokasi. Simpan string yang sering digunakan dalam cache untuk menghindari konversi berulang.
Pemeriksaan Singkat
Apa yang menyebabkan variabel lokal keluar dari stack ke heap?
Ringkasan: Stack vs Heap
Poin penting:
- Stack: cepat, pengumpulan tanpa biaya; Heap: lebih lambat, dilacak oleh pengumpulan sampah
- go build -gcflags="-m" menampilkan keputusan pelolosan
- Pembungkusan antarmuka, pengambilan alamat variabel lokal, dan pengiriman melalui saluran menyebabkan pelolosan
- Gunakan sync.Pool untuk objek yang sering dialokasikan dan dibuang
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Stack vs Heap dan Analisis Escape” gratis?
Ya — teks lengkap “Stack vs Heap dan Analisis Escape” 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 “Stack vs Heap dan Analisis Escape”?
Cara Go menentukan lokasi alokasi memori 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 1 dari 4.
Berapa lama pelajaran “Stack vs Heap dan Analisis Escape” 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