中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go語言需不需要手動管理內存

發布時間:2022-12-16 15:33:03 來源:億速云 閱讀:140 作者:iii 欄目:編程語言

這篇文章主要介紹了go語言需不需要手動管理內存的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇go語言需不需要手動管理內存文章都會有所收獲,下面我們一起來看看吧。

go語言不需要手動管理內存;go語言內置內存管理功能(GC機制),是一種自動內存管理的機制。當程序向操作系統申請的內存不再需要時,垃圾回收主動將其回收并供其他代碼進行內存申請時候復用,或者將其歸還給操作系統,這種針對內存級別資源的自動回收過程,即為垃圾回收;而負責垃圾回收的程序組件,即為垃圾回收器。

go語言不需要手動管理內存;go語言內置內存管理功能(GC機制),開發者不需要關心內存的申請和釋放,這樣為使用者帶來極大的便利。

什么是GC,又有什么用?

GC,全稱 Garbage Collection,即垃圾回收,是一種自動內存管理的機制。

當程序向操作系統申請的內存不再需要時,垃圾回收主動將其回收并供其他代碼進行內存申請時候復用,或者將其歸還給操作系統,這種針對內存級別資源的自動回收過程,即為垃圾回收。而負責垃圾回收的程序組件,即為垃圾回收器。

垃圾回收其實一個完美的 “Simplicity is Complicated” 的例子。一方面,程序員受益于 GC,無需操心、也不再需要對內存進行手動的申請和釋放操作,GC 在程序運行時自動釋放殘留的內存。另一方面,GC 對程序員幾乎不可見,僅在程序需要進行特殊優化時,通過提供可調控的 API,對 GC 的運行時機、運行開銷進行把控的時候才得以現身。

在計算中,內存空間包含兩個重要的區域:棧區 (Stack) 和堆區 (Heap);棧區一般存儲了函數調用的參數、返回值以及局部變量,不會產生內存碎片,由編譯器管理,無需開發者管理;而堆區會產生內存碎片,在 Go 語言中堆區的對象由內存分配器分配并由垃圾收集器回收

通常,垃圾回收器的執行過程被劃分為兩個半獨立的組件:

  • 賦值器(Mutator):這一名稱本質上是在指代用戶態的代碼。因為對垃圾回收器而言,用戶態的代碼僅僅只是在修改對象之間的引用關系,也就是在對象圖(對象之間引用關系的一個有向圖)上進行操作。

  • 回收器(Collector):負責執行垃圾回收的代碼。

GC中的根對象

根對象在垃圾回收的術語中又叫做根集合,它是垃圾回收器在標記過程時最先檢查的對象,包括:

  • 全局變量:程序在編譯期就能確定的那些存在于程序整個生命周期的變量。

  • 執行棧:每個 goroutine 都包含自己的執行棧,這些執行棧上包含棧上的變量及指向分配的堆內存區塊的指針。

  • 寄存器:寄存器的值可能表示一個指針,參與計算的這些指針可能指向某些賦值器分配的堆內存區塊。

垃圾回收

在 Go 語言中,垃圾回收器實現的算法是一個并發的三色標記和掃描收集器

垃回收器與 Go 程序同時運行,因此需要通過一種寫屏障算法來檢測內存中的潛在變化。啟動寫屏障的唯一條件是在短時間內停止程序,即 “Stop the World”

go語言需不需要手動管理內存

寫屏障的目的是允許收集器在收集期間保持堆上的數據完整性

1.1 實現原理

Go 語言的垃圾收集可以分成清除終止、標記、標記終止和清除四個不同的階段,其中兩個階段會產生 Stop The World (STW)

go語言需不需要手動管理內存

清除終止階段

  • 暫停程序,所有的處理器在這時會進入安全點(Safe point)

  • 如果當前垃圾收集循環是強制觸發的,我們還需要處理還未被清理的內存管理單元

標記階段 (STW)

  • 將狀態切換至 _GCmark、開啟寫屏障、用戶程序協助(Mutator Assists)并將根對象入隊

  • 恢復執行程序,標記進程和用于協助的用戶程序會開始并發標記內存中的對象,寫屏障會將被覆蓋的指針和新指針都標記成灰色,而所有新創建的對象都會被直接標記成黑色

  • 開始掃描根對象,包括所有 Goroutine 的棧、全局對象以及不在堆中的運行時數據結構,掃描 Goroutine 棧期間會暫停當前處理器

  • 依次處理灰色隊列中的對象,將對象標記成黑色并將它們指向的對象標記成灰色

  • 使用分布式的終止算法檢查剩余的工作,發現標記階段完成后進入標記終止階段

標記終止階段 (STW)

  • 暫停程序、將狀態切換至 _GCmarktermination 并關閉輔助標記的用戶程序

  • 清理處理器上的線程緩存

清理階段

  • 將狀態切換至 _GCoff 開始清理階段,初始化清理狀態并關閉寫屏障

  • 恢復用戶程序,所有新創建的對象會標記成白色

  • 后臺并發清理所有的內存管理單元,當 Goroutine 申請新的內存管理單元時就會觸發清理

1.2 三色標記法

三色標記算法將程序中的對象分成白色、黑色和灰色三類:

  • 白色對象 — 潛在的垃圾,其內存可能會被垃圾收集器回收

  • 黑色對象 — 活躍的對象,包括不存在任何引用外部指針的對象以及從根對象可達的對象

  • 灰色對象 — 活躍的對象,因為存在指向白色對象的外部指針,垃圾收集器會掃描這些對象的子對象

三色標記垃圾收集器的工作原理很簡單,可以將其歸納成以下幾個步驟:

  • 從灰色對象的集合中選擇一個灰色對象并將其標記成黑色

  • 將黑色對象指向的所有對象都標記成灰色,保證該對象和被該對象引用的對象都不會被回收

  • 重復上述兩個步驟直到對象圖中不存在灰色對象

go語言需不需要手動管理內存

關于“go語言需不需要手動管理內存”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“go語言需不需要手動管理內存”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平塘县| 井陉县| 黄石市| 中阳县| 东安县| 射阳县| 芮城县| 体育| 田东县| 华安县| 秀山| 杭州市| 丘北县| 常熟市| 荣昌县| 昌黎县| 阳东县| 酉阳| 通辽市| 湄潭县| 特克斯县| 大安市| 隆化县| 承德市| 武义县| 临邑县| 伊川县| 邵武市| 丰镇市| 基隆市| 新兴县| 广饶县| 无极县| 康马县| 福建省| 建平县| 永登县| 当阳市| 武义县| 射洪县| 娱乐|