Bahasa Go mempunyai kutipan sampah. Bahasa Go datang dengan mekanisme pengumpulan sampah (GC); GC dilaksanakan melalui proses yang berasingan. dalam pengiraan. Ruang memori mengandungi dua kawasan penting: kawasan timbunan (Timbunan) dan kawasan timbunan (Timbunan); kawasan timbunan biasanya menyimpan parameter, nilai pulangan dan pembolehubah tempatan panggilan fungsi, tidak menghasilkan pemecahan memori, diuruskan oleh pengkompil, dan tidak memerlukan pembangunan Kawasan timbunan akan menjana serpihan memori Dalam bahasa Go, objek dalam kawasan timbunan diperuntukkan oleh pengagih memori dan dikitar semula oleh pengumpul sampah.
Persekitaran pengendalian tutorial ini: sistem Windows 7, GO versi 1.18, komputer Dell G3.
Bahasa Go mempunyai mekanisme pengumpulan sampah (GC) tersendiri. GC dilakukan oleh proses berasingan, yang mencari pembolehubah yang tidak lagi digunakan dan membebaskannya. Perlu diingatkan bahawa GC akan menduduki sumber mesin apabila berjalan.
Dalam sains komputer, kutipan sampah (Kutipan Sampah, dirujuk sebagai GC) ialah Mekanisme automatik untuk menguruskan ingatan, pengumpul sampah akan cuba mengitar semula objek dan memori yang diduduki oleh program yang tidak lagi digunakan
Pengaturcara mendapat manfaat daripada GC dan tidak perlu lagi risau atau memohon secara manual untuk operasi ingatan dan pelepasan, GC secara automatik mengeluarkan baki memori apabila program sedang dijalankan
GC hampir tidak dapat dilihat oleh pengaturcara Hanya apabila program memerlukan pengoptimuman khas, pemasaan berjalan dan overhed berjalan GC boleh dilaraskan dengan menyediakan kawalan yang boleh dikawal. API. Hanya apabila anda berada di bawah kawalan anda boleh muncul
Dalam pengkomputeran, ruang memori mengandungi dua kawasan penting: kawasan tindanan (Timbunan) dan kawasan timbunan secara amnya menyimpan panggilan fungsi Parameter, nilai pulangan dan pembolehubah tempatan tidak menjana pemecahan memori dan diuruskan oleh pengkompil dan tidak perlu diuruskan oleh pembangun manakala kawasan timbunan menjana pemecahan memori dalam bahasa Go, objek dalam timbunan kawasan diperuntukkan oleh pengagih ingatan dan dikumpul oleh pemungut sampah. [Cadangan berkaitan: Pergi tutorial video, Pengajaran pengaturcaraan]
Biasanya, proses pelaksanaan pemungut sampah dibahagikan kepada dua komponen separa bebas:
1 Pengurusan dan peruntukan memori
Pergi pengurusan memori apabila memori tidak lagi digunakan Dilaksanakan secara automatik oleh perpustakaan standardnya, iaitu memperuntukkan daripada memori kepada koleksi Go. Pengurusan memori secara amnya merangkumi tiga komponen yang berbeza, iaitu atur cara pengguna (Mutator), pengalokasi (Allocator) dan pengumpul (Pengumpul) Apabila atur cara pengguna memohon memori, ia akan memohon untuk ingatan baharu melalui pengalokasi memori, dan pengalokasi Akan bertanggungjawab untuk memulakan kawasan memori yang sepadan daripada timbunan
Dalam bahasa pengaturcaraan, pengalokasi memori secara amnya mempunyai dua kaedah peruntukan:
Pengumpuk Linear (Pengumpuk Berjujukan, Peruntukan Bump)
Senarai Bebas Terbiar Allocator
Linear Allocator
Linear Allocation (Bump Allocator) ialah kaedah peruntukan memori yang cekap, tetapi ia mempunyai had utama. Apabila pengguna menggunakan pengagih linear, dia hanya perlu mengekalkan penunjuk ke lokasi memori tertentu dalam ingatan Jika program pengguna memohon memori daripada pengalokasi, pengalokasi hanya perlu menyemak baki memori kosong, kembalikan memori yang diperuntukkan. kawasan dan ubah suai penunjuk dalam Lokasi dalam ingatan
Walaupun pengalokasi linear mempunyai kelajuan pelaksanaan yang lebih pantas dan kerumitan pelaksanaan yang lebih rendah, pengalokasi linear tidak boleh menggunakan semula memori selepas memori dikeluarkan. Seperti yang ditunjukkan dalam rajah di bawah, jika memori yang diperuntukkan dikitar semula, pengalokasi linear tidak boleh menggunakan semula memori merah
Oleh itu, pengalokasi linear perlu digunakan bersama-sama dengan algoritma kutipan sampah yang sesuai
Mark-Compact
Menyalin GC)
Kitar semula generasi (Generasional GC)
Algoritma di atas boleh menyahfragmentasi objek yang masih hidup melalui penyalinan dan penggabungan memori percuma dengan kerap, supaya kecekapan pengalokasi linear boleh digunakan untuk meningkatkan prestasi pengalokasi memori .
Free-List Allocator
Free-List Allocator (Free-List Allocator) boleh menggunakan semula memori yang telah dikeluarkan Ia akan mengekalkan senarai terpaut secara dalaman. struktur data. Apabila program pengguna memohon untuk ingatan, pengalokasi senarai terpaut percuma akan merentasi blok memori percuma untuk mencari memori yang cukup besar, kemudian memohon sumber baharu dan mengubah suai senarai terpaut
Terdapat empat strategi biasa untuk pengagih senarai terpaut percuma:
Strategi keempat ialah serupa dengan strategi peruntukan memori yang digunakan dalam bahasa Go
Strategi ini akan membahagikan memori kepada senarai terpaut yang terdiri daripada blok memori 4, 8, 16 dan 32-bait . Apabila kita memohon memori 8-bait daripada pengagih memori, ia akan Cari blok memori percuma yang memenuhi syarat dalam rajah di atas dan mengembalikannya. Strategi peruntukan penyesuaian pengasingan mengurangkan bilangan blok memori yang perlu dilalui dan meningkatkan kecekapan peruntukan memori
Gambar menunjukkan komposisi peruntukan memori:
Dalam bahasa Go, semua objek pada timbunan akan memperuntukkan memori dengan memanggil runtime.newobject fungsi, yang Fungsi akan memanggil runtime.mallocgc untuk memperuntukkan ruang memori saiz yang ditentukan Ini juga merupakan fungsi yang diperlukan untuk program pengguna untuk memohon ruang memori pada timbunan >
Seperti yang dapat dilihat daripada kodfunc mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer { mp := acquirem() mp.mallocing = 1 c := gomcache() var x unsafe.Pointer noscan := typ == nil || typ.ptrdata == 0 if size Laksanakan logik peruntukan yang berbeza mengikut saiz objek, bahagikan kepada objek mikro, objek kecil dan objek besar mengikut saiz <p><code>runtime.mallocgc</code></p> Objek mikro
(0, 16B)
Objek kecil[16B, 32KB]
Objek besar(32KB, +∞)
Untuk peruntukan kecil kurang daripada 32kb, Go akan cuba mendapatkannya daripada cache setempat
Dapatkan memori, cache mengendalikan senarai span (blok memori 32kb)mcache
mspan
Setiap utas M diperuntukkan kepada pemproses P, memproses paling banyak satu demi satu
. Apabila memperuntukkan memori, semasa akan menggunakan cache P setempat semasanya untuk mencari objek percuma pertama yang tersedia dalam senarai goroutine
goroutine
span
Pergi tidak menggunakan cache tempatan untuk menguruskan peruntukan yang besar. Peruntukan yang lebih besar daripada 32kb ini dibundarkan kepada saiz halaman dan halaman diperuntukkan terus kepada timbunan
2. Pengumpulan sampahDalam bahasa Go, algoritma yang dilaksanakan oleh pengumpul sampah ialah tanda tiga warna serentak dan pengumpul imbasan
Pengumpul sampah berjalan pada masa yang sama sebagai program Go, jadi ia perlu dilalui algoritma
write barrieruntuk mengesan potensi perubahan dalam ingatan. Satu-satunya syarat untuk memulakan halangan tulis ialah menghentikan program untuk tempoh masa yang singkat, iaitu "Hentikan Dunia" Integriti data pada timbunan
2.1 Prinsip pelaksanaanPengumpulan sampah bahasa Go boleh dibahagikan kepada penamatan jelas, penandaan dan penamatan tanda dan empat fasa pembersihan yang berbeza, dua daripadanya menjana Stop The World (STW)
Jeda program dan semua pemproses akan memasuki titik selamat pada masa ini
Jika semasa kitaran kutipan sampah dicetuskan secara paksa, kita juga perlu berurusan dengan unit pengurusan memori yang belum dibersihkanFasa Penandaan (STW)
Tukar keadaan kepada _GCmark
, dayakan penghalang tulis, bantuan atur cara pengguna (Mutator Assists) dan arahkan objek akar
Sambung semula pelaksanaan program , Proses penandaan dan program pengguna membantu akan mula menandakan objek secara serentak dalam ingatan Halangan tulis akan menandakan kedua-dua penunjuk yang ditimpa dan penunjuk baharu dalam warna kelabu, dan semua objek yang baru dibuat akan ditandakan secara langsung dengan warna hitam
jeda program, tukar status kepada
_GCmarktermination
Bersihkan cache benang pada pemproses
_GCoff
Pilih objek kelabu daripada koleksi objek kelabu dan tandakannya hitam
Tandakan semua objek yang ditunjuk oleh objek hitam sebagai kelabu, pastikan objek mahupun objek yang dirujuk oleh objek tidak akan dikitar semula
Ulang dua langkah di atas sehingga tiada warna kelabu objek dalam graf objek
Video Pengaturcaraan! !
Atas ialah kandungan terperinci Adakah bahasa Go mempunyai kutipan sampah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!