1. 概述
????????垃圾回收是一種自動內存管理技術:通過檢測程序中不再使用的內存,并釋放這些內存供其他對象使用。
????????應用程序中會使用到兩種內存,分別為堆(Heap)和棧(Stack)。GC不負責回收棧內存,只負責回收堆內存。?函數執行完后,棧內存直接釋放,不需要GC回收;堆是程序共享的內存,需要GC進行回收。
????????在Go語言中,垃圾回收器通過標記-清除(Mark-Sweep)算法來實現對內存的管理。
2.?實現細節
(1) 標記階段: 垃圾回收器從根對象(具體見下面)開始,遍歷所有可達對象,將其標記為活動的或被引用的。根對象包括全局變量、靜態變量等。(具體見下面的三色標記法) 。
(2) 清除階段:垃圾回收器遍歷所有對象,將未被標記的對象(不可達對象)進行回收,其占用的內存空間標記為空閑狀態。
(3) 壓縮階段:垃圾回收器對內存進行壓縮,將所有空閑的內存空間合并成一個連續的內存塊,以便更高效地分配內存。
3. 根對象包括:
(1)?全局變量
:存在于程序整個生命周期的變量。
(2)?執行棧
:每個 goroutine 都包含自己的執行棧,執行棧上包含棧上的變量及指向堆內存區塊的指針。
(3)?寄存器
:寄存器的值可能表示一個指針,指向堆內存區塊。
4. 三色標記法(go1.5垃圾回收原理)
? ? 相比于1.3的標記法,1.5的三色標記法優勢是無序STW(暫停程序),按以下步驟操作:
(1)?只要是該程序創建的對象,都標記為白色。
(2)?每次GC開始,從根對象開始遍歷所有對象,把遍歷到的對象從白色放到灰色集合。
(3)?遍歷灰色集合,將灰色對象引用到的對象,從白色集合放到灰色集合;然后將此灰色對象放到黑色集合。
(4)?重復第(3)步直到灰色集合為空。
(5)?回收所有白色標記的對象(垃圾回收)
5.?屏障機制
? ? 在標記階段過程中,應用程序可能會改變對象引用樹,導致 三色不變式 規則被破壞。所以需要添加屏障機制,保證三色不變式有效,主要兩個機制如下:
(1)?插入寫屏障:在A對象引用B對象時,B對象被標記為灰色。
(2)?刪除寫屏障:被刪除的對象如果為灰色或者白色,那么被標記為灰色
7.?垃圾回收的性能優化體現點
(1)?并行化:標記和清除階段可以并行執行,以提高垃圾回收的性能。
(2)?延遲清除:為了減少垃圾回收過程中的停頓時間,垃圾回收器采用延遲清除策略。即只有在內存壓力較大時才進行清除操作,以避免頻繁的垃圾回收。
(3)?懶惰標記:指只有在需要分配新對象時才進行標記操作。這樣可以減少不必要的標記工作,提高垃圾回收的性能。
(4)?內存壓縮:通過內存壓縮技術,可以減少內存碎片,提高內存分配和釋放的效率。
8.?總結
????????Go語言的垃圾回收機制是一種高效且可靠的內存管理方案。
? ? ? ? 通過采用標記-清除算法以及一系列性能優化策略,垃圾回收器能夠自動管理內存,避免內存泄漏和內存溢出等問題。
? ? ? ? 同時,Go語言的垃圾回收器還針對并發編程進行了優化,以減少對并發執行的影響。
參考文章:go垃圾回收機制(三色標記法)& 屏障機制_go三色標記法與讀寫屏障-CSDN博客
GO進階(5) 垃圾回收機制-騰訊云開發者社區-騰訊云?
百度安全驗證?