Rumah >pembangunan bahagian belakang >Golang >Adakah bahasa go mempunyai gc?
Bahasa Go mempunyai gc. GC merujuk kepada pengumpulan sampah, mekanisme pengurusan memori automatik yang menyokong GC, dan kitar semula ruang memori objek dalam bahasa Go diselesaikan melalui mekanisme GC. Untuk bahasa Go, GC bahasa Go menggunakan tiga warna: tiada penjanaan (objek tidak dibahagikan kepada generasi), tiada pengisihan (objek tidak dialihkan dan diisih semasa proses kitar semula) dan serentak (dilaksanakan serentak dengan kod pengguna) . Algoritma tanda dan sapu.
Persekitaran pengendalian tutorial ini: sistem Windows 7, GO versi 1.18, komputer Dell G3.
Mekanisme GC menjadi popular selepas bahasa Java digunakan secara meluas Bahasa skrip kemudiannya Python menyokong GC, dan GO juga menyokong GC.
Ciri ketara bahasa Go dan bahasa C/C ialah kitar semula ruang memori objek dalam Go diselesaikan melalui mekanisme GC dan tidak memerlukan aplikasi dan keluaran manual oleh pengaturcara seperti C, jadi Memori bocor agak tidak mungkin berlaku di Go. Hari ini kita akan bercakap tentang mekanisme GC dalam Go.
Apakah GC dan apakah kegunaannya?
GC, nama penuh Garbage Collection, ialah mekanisme untuk pengurusan memori automatik.
Apabila memori yang diminta oleh program daripada sistem pengendalian tidak lagi diperlukan, kutipan sampah mengitar semulanya secara aktif dan menggunakannya semula untuk kod lain untuk memohon ingatan, atau mengembalikannya kepada sistem pengendalian -sumber peringkat Proses kitar semula automatik ialah kutipan sampah. Komponen program yang bertanggungjawab untuk kutipan sampah ialah pemungut sampah.
Pengumpulan sampah sebenarnya adalah contoh sempurna "Kesederhanaan itu Rumit". Di satu pihak, pengaturcara mendapat manfaat daripada GC dan tidak perlu risau atau memohon secara manual dan melepaskan memori secara automatik melepaskan baki memori apabila program sedang berjalan. Sebaliknya, GC hampir tidak dapat dilihat oleh pengaturcara ia hanya muncul apabila program memerlukan pengoptimuman khas dengan menyediakan API yang boleh dikawal untuk mengawal masa larian dan overhed GC.
Biasanya, proses pelaksanaan pemungut sampah dibahagikan kepada dua komponen separa bebas:
Mutator: Nama ini pada asasnya merujuk kepada Kod yang mewakili mod pengguna. Kerana untuk pengumpul sampah, kod mod pengguna hanya mengubah suai hubungan rujukan antara objek, iaitu, beroperasi pada graf objek (graf terarah hubungan rujukan antara objek).
Pengumpul: Kod yang bertanggungjawab untuk melaksanakan kutipan sampah.
Objek akar dalam GC
Objek akar juga dipanggil koleksi akar dalam terminologi pengumpulan sampah . Objek yang pengumpul sampah mula-mula semak semasa menandakan proses termasuk:
Pembolehubah global: pembolehubah yang wujud sepanjang keseluruhan kitaran hayat program yang boleh ditentukan pada masa penyusunan .
Timbunan pelaksanaan: Setiap goroutine mengandungi timbunan pelaksanaan sendiri, yang mengandungi pembolehubah pada tindanan dan penunjuk kepada blok memori timbunan yang diperuntukkan.
Daftar: Nilai daftar mungkin mewakili penunjuk, dan penunjuk ini yang terlibat dalam pengiraan mungkin menunjukkan blok ingatan timbunan yang diperuntukkan oleh sesetengah penilai.
Cara GC dilaksanakan
Kewujudan semua algoritma GC boleh diringkaskan sebagai penjejakan dan rujukan adalah penggunaan campuran kedua-dua bentuk ini.
Menjejaki GC
Bermula dari objek akar, berdasarkan maklumat rujukan antara objek, teruskan langkah demi langkah sehingga keseluruhan timbunan diimbas dan menentukan Objek yang perlu dikekalkan, dengan itu mengitar semula semua objek yang boleh dikitar semula. Pelaksanaan JavaScript Go, Java dan V8 semuanya menjejaki GC.
GC pengiraan rujukan
Setiap objek itu sendiri mengandungi kaunter rujukan, yang dikitar semula secara automatik apabila kaunter mencapai sifar. Oleh kerana kaedah ini mempunyai banyak kelemahan, ia biasanya tidak digunakan apabila mengejar prestasi tinggi. Python, Objective-C, dsb. semuanya adalah GC pengiraan rujukan.
Kaedah pelaksanaan GC yang lebih biasa pada masa ini termasuk:
Jenis penjejakan, yang dibahagikan kepada pelbagai jenis, seperti:
Mark Sweep: Bermula dari objek akar, tandakan objek yang ditentukan masih hidup dan bersihkan objek yang boleh dikitar semula.
Penyahperangan tanda: Adalah dicadangkan untuk menyelesaikan masalah pemecahan memori Semasa proses penandaan, objek diisih ke dalam sekeping memori yang berterusan sebanyak mungkin.
Tambahan: Laksanakan proses penandaan dan pembersihan secara berkelompok, melaksanakan sebahagian kecil setiap kali, dengan itu memajukan pengumpulan sampah secara berperingkat, mencapai hampir masa nyata dan hampir tiada jeda Tujuan.
Isihan tambahan: Atas dasar penambahan, proses pengisihan objek ditambah.
Generasi: Kelaskan objek mengikut tempoh masa kemandirian mereka yang masa kemandiriannya kurang daripada nilai tertentu ialah generasi muda, dan mereka yang masa kemandiriannya lebih besar daripada nilai tertentu ialah. generasi lama mereka tidak akan mengambil bahagian dalam kitar semula. Dan objek dikitar semula berdasarkan andaian generasi (jika objek tidak hidup lama, ia cenderung untuk dikitar semula, jika objek telah hidup untuk masa yang lama, ia cenderung untuk hidup lebih lama).
Kiraan rujukan: Kitar semula mengikut kiraan rujukan objek itu sendiri, dan kitar semula serta-merta apabila kiraan rujukan mencapai sifar.
Pelaksanaan GC dalam Go
For Go, GC Go menggunakan tanpa generasi (Objek tidak dibahagikan kepada generasi ), tiada pengisihan (objek tidak dialih dan diisih semasa proses kitar semula), dan serentak (dilaksanakan serentak dengan kod pengguna) algoritma pembersihan tanda tiga warna. [Cadangan berkaitan: Pergi tutorial video]
Sebabnya adalah seperti berikut:
Kelebihan penyahfragmentasi objek adalah untuk menyelesaikan masalah pemecahan memori dan "membenarkan" susunan penggunaan Pengagih memori. Walau bagaimanapun, algoritma peruntukan masa jalan Go adalah berdasarkan tcmalloc, dan pada dasarnya tiada masalah pemecahan. Dan pengagih ingatan berjujukan tidak sesuai dalam senario berbilang benang. Go menggunakan algoritma peruntukan memori moden berdasarkan tcmalloc, dan pengisihan objek tidak akan membawa peningkatan prestasi yang ketara.
GC generasi bergantung pada andaian generasi, iaitu, GC meletakkan sasaran pemulihan utama pada objek yang baru dicipta (yang mempunyai masa kelangsungan hidup yang singkat dan lebih cenderung untuk dikitar semula) dan bukannya kerap. menyemak Semua objek. Walau bagaimanapun, pengkompil Go akan menyimpan kebanyakan objek baharu pada timbunan melalui analisis melarikan diri (timbunan dikitar semula secara langsung), dan hanya objek yang perlu wujud untuk masa yang lama akan diperuntukkan kepada timbunan yang memerlukan pengumpulan sampah. Dalam erti kata lain, objek jangka pendek yang dikitar semula oleh GC generasi diperuntukkan terus kepada timbunan dalam Go Apabila goroutine mati, timbunan akan dikitar semula secara langsung tanpa penyertaan GC Oleh itu, andaian generasi tidak membawa Come untuk kelebihan langsung. Selain itu, pengumpul sampah Go dilaksanakan serentak dengan kod pengguna, jadi masa STW tiada kaitan dengan penjanaan objek dan saiz objek. Pasukan Go lebih tertumpu pada cara untuk membolehkan GC melaksanakan dengan lebih baik secara serentak dengan kod pengguna (menggunakan CPU yang sesuai untuk melaksanakan kutipan sampah) dan bukannya pada matlamat tunggal untuk mengurangkan masa jeda.
Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati: Video Pengaturcaraan! !
Atas ialah kandungan terperinci Adakah bahasa go mempunyai gc?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!