Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pemahaman mendalam tentang mekanisme pengumpulan sampah dalam bahasa Go

Pemahaman mendalam tentang mekanisme pengumpulan sampah dalam bahasa Go

PHPz
PHPzasal
2023-09-29 08:25:431026semak imbas

Pemahaman mendalam tentang mekanisme pengumpulan sampah dalam bahasa Go

Pemahaman mendalam tentang mekanisme pengumpulan sampah dalam bahasa Go memerlukan contoh kod khusus

Pengenalan:
Dengan pembangunan perisian dan komputer Dengan perkembangan teknologi yang berterusan, Pengumpulan Sampah (GC), sebagai mekanisme pengurusan memori automatik, telah menjadi salah satu ciri umum dalam bahasa pengaturcaraan moden. Mekanisme pengumpulan sampah membantu pembangun menyelesaikan kerumitan dan kesukaran pengurusan memori manual, meningkatkan kebolehpercayaan dan kecekapan pembangunan aplikasi dengan banyak. Sebagai bahasa dengan kecekapan pembangunan tinggi dan prestasi serentak yang kukuh, mekanisme pengumpulan sampah bahasa Go merupakan bahagian penting dalam kecekapannya. Artikel ini akan menyelidiki mekanisme pengumpulan sampah dalam bahasa Go dan mendalami pemahaman kita tentang mekanisme ini melalui contoh kod khusus.

1. Algoritma kutipan sampah
Bahasa Go menggunakan algoritma kutipan sampah yang dipanggil Concurrent Mark and Sweep (CMS). Algoritma ini mempunyai ciri-ciri berikut:

  1. Pemprosesan serentak: Semasa proses kutipan sampah, atur cara boleh terus berjalan tanpa menghentikan keseluruhan program, mengurangkan masa jeda.
  2. Pemprosesan tambahan: Proses kutipan sampah dibahagikan kepada beberapa peringkat, dan hanya sebahagian daripada objek diproses pada satu masa, mengelakkan kelewatan yang lama.

2. Proses pengumpulan sampah
Proses kutipan sampah bahasa Go boleh dibahagikan kepada tiga peringkat: peringkat menanda, peringkat pembersihan dan peringkat mampatan.

  1. Fasa penandaan:
    Fasa penandaan ialah fasa pertama pengumpulan sampah dan menandakan objek yang boleh dicapai sebagai objek "hidup" dan tidak ditanda itu "sampah". Ini adalah peringkat yang paling memakan masa bagi keseluruhan proses pengumpulan sampah, tetapi kerana bahasa Go menggunakan algoritma penandaan serentak, penandaan boleh dilakukan semasa program sedang berjalan.

Berikut ialah kod contoh ringkas yang menunjukkan cara mencetuskan proses kutipan sampah secara manual:

package main

import (
    "fmt"
    "runtime"
    "time"
)

func main() {
    fmt.Println("程序开始时的内存占用:", getMemUsage())

    for i := 0; i < 10; i++ {
        createGarbage()
    }

    fmt.Println("初次创建垃圾后的内存占用:", getMemUsage())

    // 手动触发垃圾回收
    runtime.GC()

    fmt.Println("手动触发垃圾回收后的内存占用:", getMemUsage())
}

func createGarbage() {
    for i := 0; i < 10000; i++ {
        _ = make([]byte, 1024)
    }
}

func getMemUsage() uint64 {
    var m runtime.MemStats
    runtime.ReadMemStats(&m)
    return m.Alloc
}

Dalam kod sampel ini, kami memanggil createSampah berfungsi 10 kali untuk mencipta beberapa objek sampah. Dalam keadaan awal, kita boleh menyemak penggunaan memori program dengan memanggil fungsi getMemUsage. Kemudian, kami memanggil runtime.GC() secara manual untuk mencetuskan kutipan sampah. Memanggil fungsi getMemUsage sekali lagi, kita dapat melihat bahawa penggunaan memori program telah dikurangkan selepas kutipan sampah Ini kerana kutipan sampah membersihkan objek yang tidak dirujuk. createGarbage 函数10次来创建了一些垃圾对象。在初始状态下,我们可以通过调用 getMemUsage 函数来查看程序的内存占用情况。然后,我们手动调用了 runtime.GC() 来触发垃圾回收。再次调用 getMemUsage 函数,我们可以看到,垃圾回收后程序的内存占用情况有所减少,这是因为垃圾回收将未被引用的对象进行了清理。

  1. 清扫阶段:
    清扫阶段是垃圾回收的第二个阶段,它主要负责回收被标记为“垃圾”的对象。在此阶段,垃圾回收器遍历堆中的所有对象,将未标记的对象释放,并将堆空间重新回收。
  2. 压缩阶段:
    压缩阶段是垃圾回收的最后一个阶段,它的主要作用是对堆进行压缩。在清扫阶段释放了一些未标记的对象后,会产生大量的内存空洞,这些内存空洞会影响程序的内存分配效率。压缩阶段会将存活的对象向一端移动,并释放出空余的空间。压缩后,程序可以更高效地使用内存。

三、垃圾回收优化参数
为了提供更好的性能和可调节性,Go语言提供了一些垃圾回收优化参数,可以根据实际情况进行调整。

  1. GOGC:通过设置环境变量 GOGC 可以调整垃圾回收器的触发和停顿时间的平衡。默认值是 100,表示每生成 100 个对象时会自动触发垃圾回收。较大的值可以降低垃圾回收器的触发频率,但也会导致较长的停顿时间。
  2. GODEBUG:通过设置环境变量 GODEBUG 可以启用或禁用一些垃圾回收相关的调试信息。例如,可以通过设置 GODEBUG=gctrace=1
    1. Fasa pembersihan:
    Fasa pembersihan ialah fasa kedua kutipan sampah terutamanya untuk mengitar semula objek yang ditandakan sebagai "sampah". Semasa fasa ini, pemungut sampah merentasi semua objek dalam timbunan, melepaskan objek yang tidak bertanda dan menuntut semula ruang timbunan.


    Fasa mampatan:

    Fasa mampatan ialah fasa terakhir kutipan sampah, dan fungsi utamanya adalah untuk memampatkan timbunan. Selepas beberapa objek tidak bertanda dilepaskan semasa fasa pembersihan, sejumlah besar lubang memori akan dihasilkan, dan lubang memori ini akan menjejaskan kecekapan peruntukan memori program. Fasa mampatan menggerakkan objek yang masih hidup ke satu hujung dan membebaskan ruang kosong. Selepas pemampatan, atur cara boleh menggunakan memori dengan lebih cekap.

      3. Parameter pengoptimuman kutipan sampah
    • Untuk memberikan prestasi dan kebolehlarasan yang lebih baik, bahasa Go menyediakan beberapa parameter pengoptimuman kutipan sampah, yang boleh dilaraskan mengikut situasi sebenar.
    • GOGC: Keseimbangan antara masa pencetus dan jeda pemungut sampah boleh dilaraskan dengan menetapkan pembolehubah persekitaran GOGC. Nilai lalai ialah 100, yang bermaksud kutipan sampah akan dicetuskan secara automatik setiap kali objek 100 dijana. Nilai yang lebih besar boleh mencetuskan pemungut sampah kurang kerap, tetapi juga boleh mengakibatkan masa jeda yang lebih lama.
    #🎜🎜#GODEBUG: Sesetengah maklumat penyahpepijatan berkaitan pengumpulan sampah boleh didayakan atau dilumpuhkan dengan menetapkan pembolehubah persekitaran GODEBUG. Sebagai contoh, anda boleh mendayakan penjejakan kutipan sampah dengan menetapkan GODEBUG=gctrace=1 untuk melihat pelaksanaan setiap peringkat. #🎜🎜##🎜🎜##🎜🎜# 4. Ringkasan #🎜🎜# Artikel ini membincangkan mekanisme kutipan sampah dalam bahasa Go dan mendalami pemahaman mekanisme melalui contoh kod tertentu. Mekanisme kutipan sampah membolehkan pembangun menumpukan lebih pada pelaksanaan logik program tanpa memberi terlalu banyak perhatian kepada pengurusan memori. Dengan melaraskan parameter pemungut sampah dengan betul, prestasi dan kebolehlarasan program boleh dipertingkatkan lagi. Saya percaya bahawa dengan pemahaman yang mendalam tentang mekanisme pengumpulan sampah, kita boleh memanfaatkan bahasa Go dengan lebih baik dan membangunkan aplikasi yang cekap dan boleh dipercayai. #🎜🎜##🎜🎜# Rujukan: #🎜🎜##🎜🎜##🎜🎜#Go dokumentasi rasmi bahasa (https://golang.org/doc/) #🎜🎜##🎜🎜#"The Go Programming Language" oleh Alan A. A. Donovan dan Brian W. Kernighan#🎜🎜##🎜🎜#

    Atas ialah kandungan terperinci Pemahaman mendalam tentang mekanisme pengumpulan sampah dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn