Adakah bahasa Go mempunyai kutipan sampah?
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.
Penjelasan terperinci tentang mekanisme kutipan sampah GC dalam bahasa Go
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:
- Program pengguna (Mutator): kod mod pengguna Untuk GC, kod mod pengguna hanya mengubah suai hubungan rujukan antara objek
- Pengumpul (Pengumpul): bertanggungjawab untuk melaksanakan Kod kutipan sampah
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
1.1 Kaedah peruntukan pengagih memori
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:
- First-Fit - melintasi dari kepala senarai terpaut dan pilih saiz pertama Memori blok lebih besar daripada memori yang diminta
- Loop penyesuaian pertama (Next-Fit) — Traverse dari penghujung traversal terakhir, dan pilih blok memori pertama yang saiznya lebih besar daripada memori yang diminta
- Penyesuaian optimum (Paling Sesuai) — Melintasi keseluruhan senarai terpaut dari kepala senarai terpaut, pilih blok memori yang paling sesuai
- Penyesuaian Terpisah (Segregated-Fit) — Pisahkan memori kepada beberapa senarai terpaut, saiz blok memori dalam setiap senarai terpaut Sama, apabila memohon memori, mula-mula cari senarai terpaut yang memenuhi syarat, dan kemudian pilih blok memori yang sesuai daripada senarai terpaut
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
1.2 Peruntukan memori dalam Go
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
- — Gunakan pengalokasi mikro dahulu, kemudian cuba utas dalam urutan Cache, cache pusat dan memori yang diperuntukkan timbunan
-
(0, 16B)
Objek kecil — Cuba peruntukkan memori menggunakan cache benang, cache pusat dan timbunan masuk perintah -
[16B, 32KB]
Objek besar — Peruntukkan memori terus pada timbunan (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
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
Pengumpulan 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)
Kosongkan fasa penamatan
Jeda program dan semua pemproses akan memasuki titik selamat pada masa ini
Fasa Penandaan (STW)
-
Tukar keadaan kepada
_GCmark
, dayakan penghalang tulis, bantuan atur cara pengguna (Mutator Assists) dan arahkan objek akarSambung 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
- Mula mengimbas objek akar, termasuk semua tindanan Goroutine, objek global dan struktur data masa jalan yang tiada dalam timbunan Pemproses semasa akan dijeda semasa pengimbasan tindanan Goroutine Proses objek dalam baris gilir kelabu mengikut turutan, tandakan objek hitam dan tandakan objek yang mereka tunjuk kepada kelabu
- Gunakan algoritma penamatan teragih untuk menyemak kerja yang tinggal dan temui fasa penandaan Selepas selesai, masukkan fasa penamatan tanda
jeda program, tukar status kepada
- dan Program pengguna yang mematikan tag tambahan
-
_GCmarktermination
Bersihkan cache benang pada pemproses
- Tukar status Tukar kepada
- untuk memulakan fasa pembersihan, mulakan keadaan pembersihan dan tutup halangan tulis
_GCoff
Pulihkan atur cara pengguna, semua objek yang baru dibuat akan ditandakan dengan warna putih - Bersihkan semua unit pengurusan memori di latar belakang secara serentak akan dicetuskan apabila Goroutine memohon untuk unit pengurusan memori baharu
2.2 Tanda tiga warna Algoritma penandaan tiga warna tiga warna membahagikan objek dalam atur cara kepada tiga kategori: putih, hitam dan kelabu:
Objek putih - potensi sampah, yang ingatannya mungkin sampah Pengumpul mengitar semula objek hitam - objek aktif, termasuk objek yang tidak mempunyai sebarang rujukan kepada penunjuk luaran dan objek yang boleh dicapai daripada objek akar- objek kelabu - objek aktif, kerana terdapat penunjuk ke putih Penunjuk luaran objek, pengumpul sampah akan mengimbas sub-objek objek ini
- Prinsip kerja tanda tiga warna pengumpul sampah adalah sangat mudah dan boleh diringkaskan ke dalam langkah-langkah berikut:
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Perpustakaan yang digunakan untuk operasi nombor terapung dalam bahasa Go memperkenalkan cara memastikan ketepatannya ...

Masalah Threading Giliran di GO Crawler Colly meneroka masalah menggunakan Perpustakaan Colly Crawler dalam bahasa Go, pemaju sering menghadapi masalah dengan benang dan permintaan beratur. � ...

Perpustakaan mana yang dibangunkan oleh syarikat besar atau projek sumber terbuka yang terkenal? Semasa pengaturcaraan di GO, pemaju sering menghadapi beberapa keperluan biasa, ...

Dua cara untuk menentukan struktur dalam bahasa Go: perbezaan antara VAR dan jenis kata kunci. Apabila menentukan struktur, pergi bahasa sering melihat dua cara menulis yang berbeza: pertama ...

Perbezaan antara percetakan rentetan dalam bahasa Go: perbezaan kesan menggunakan fungsi println dan rentetan () sedang ...

Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apabila menggunakan Goland untuk Pembangunan Bahasa GO, banyak pemaju akan menghadapi tag struktur tersuai ...

Masalah menggunakan redisstream untuk melaksanakan beratur mesej dalam bahasa Go menggunakan bahasa Go dan redis ...

Cecair mengendalikan isu keselamatan bersamaan dalam penulisan log pelbagai proses. Proses berganda menulis fail log yang sama pada masa yang sama. Bagaimana untuk memastikan kesesuaian selamat dan cekap? Ini ...
