中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

go語(yǔ)言需不需要手動(dòng)管理內(nèi)存

這篇文章主要介紹了go語(yǔ)言需不需要手動(dòng)管理內(nèi)存的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇go語(yǔ)言需不需要手動(dòng)管理內(nèi)存文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)寧明,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792

go語(yǔ)言不需要手動(dòng)管理內(nèi)存;go語(yǔ)言內(nèi)置內(nèi)存管理功能(GC機(jī)制),是一種自動(dòng)內(nèi)存管理的機(jī)制。當(dāng)程序向操作系統(tǒng)申請(qǐng)的內(nèi)存不再需要時(shí),垃圾回收主動(dòng)將其回收并供其他代碼進(jìn)行內(nèi)存申請(qǐng)時(shí)候復(fù)用,或者將其歸還給操作系統(tǒng),這種針對(duì)內(nèi)存級(jí)別資源的自動(dòng)回收過(guò)程,即為垃圾回收;而負(fù)責(zé)垃圾回收的程序組件,即為垃圾回收器。

go語(yǔ)言不需要手動(dòng)管理內(nèi)存;go語(yǔ)言內(nèi)置內(nèi)存管理功能(GC機(jī)制),開發(fā)者不需要關(guān)心內(nèi)存的申請(qǐng)和釋放,這樣為使用者帶來(lái)極大的便利。

什么是GC,又有什么用?

GC,全稱 Garbage Collection,即垃圾回收,是一種自動(dòng)內(nèi)存管理的機(jī)制。

當(dāng)程序向操作系統(tǒng)申請(qǐng)的內(nèi)存不再需要時(shí),垃圾回收主動(dòng)將其回收并供其他代碼進(jìn)行內(nèi)存申請(qǐng)時(shí)候復(fù)用,或者將其歸還給操作系統(tǒng),這種針對(duì)內(nèi)存級(jí)別資源的自動(dòng)回收過(guò)程,即為垃圾回收。而負(fù)責(zé)垃圾回收的程序組件,即為垃圾回收器。

垃圾回收其實(shí)一個(gè)完美的 “Simplicity is Complicated” 的例子。一方面,程序員受益于 GC,無(wú)需操心、也不再需要對(duì)內(nèi)存進(jìn)行手動(dòng)的申請(qǐng)和釋放操作,GC 在程序運(yùn)行時(shí)自動(dòng)釋放殘留的內(nèi)存。另一方面,GC 對(duì)程序員幾乎不可見,僅在程序需要進(jìn)行特殊優(yōu)化時(shí),通過(guò)提供可調(diào)控的 API,對(duì) GC 的運(yùn)行時(shí)機(jī)、運(yùn)行開銷進(jìn)行把控的時(shí)候才得以現(xiàn)身。

在計(jì)算中,內(nèi)存空間包含兩個(gè)重要的區(qū)域:棧區(qū) (Stack) 和堆區(qū) (Heap);棧區(qū)一般存儲(chǔ)了函數(shù)調(diào)用的參數(shù)、返回值以及局部變量,不會(huì)產(chǎn)生內(nèi)存碎片,由編譯器管理,無(wú)需開發(fā)者管理;而堆區(qū)會(huì)產(chǎn)生內(nèi)存碎片,在 Go 語(yǔ)言中堆區(qū)的對(duì)象由內(nèi)存分配器分配并由垃圾收集器回收

通常,垃圾回收器的執(zhí)行過(guò)程被劃分為兩個(gè)半獨(dú)立的組件:

  • 賦值器(Mutator):這一名稱本質(zhì)上是在指代用戶態(tài)的代碼。因?yàn)閷?duì)垃圾回收器而言,用戶態(tài)的代碼僅僅只是在修改對(duì)象之間的引用關(guān)系,也就是在對(duì)象圖(對(duì)象之間引用關(guān)系的一個(gè)有向圖)上進(jìn)行操作。

  • 回收器(Collector):負(fù)責(zé)執(zhí)行垃圾回收的代碼。

GC中的根對(duì)象

根對(duì)象在垃圾回收的術(shù)語(yǔ)中又叫做根集合,它是垃圾回收器在標(biāo)記過(guò)程時(shí)最先檢查的對(duì)象,包括:

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

  • 執(zhí)行棧:每個(gè) goroutine 都包含自己的執(zhí)行棧,這些執(zhí)行棧上包含棧上的變量及指向分配的堆內(nèi)存區(qū)塊的指針。

  • 寄存器:寄存器的值可能表示一個(gè)指針,參與計(jì)算的這些指針可能指向某些賦值器分配的堆內(nèi)存區(qū)塊。

垃圾回收

在 Go 語(yǔ)言中,垃圾回收器實(shí)現(xiàn)的算法是一個(gè)并發(fā)的三色標(biāo)記和掃描收集器

垃回收器與 Go 程序同時(shí)運(yùn)行,因此需要通過(guò)一種寫屏障算法來(lái)檢測(cè)內(nèi)存中的潛在變化。啟動(dòng)寫屏障的唯一條件是在短時(shí)間內(nèi)停止程序,即 “Stop the World”

go語(yǔ)言需不需要手動(dòng)管理內(nèi)存

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

1.1 實(shí)現(xiàn)原理

Go 語(yǔ)言的垃圾收集可以分成清除終止、標(biāo)記、標(biāo)記終止和清除四個(gè)不同的階段,其中兩個(gè)階段會(huì)產(chǎn)生 Stop The World (STW)

go語(yǔ)言需不需要手動(dòng)管理內(nèi)存

清除終止階段

  • 暫停程序,所有的處理器在這時(shí)會(huì)進(jìn)入安全點(diǎn)(Safe point)

  • 如果當(dāng)前垃圾收集循環(huán)是強(qiáng)制觸發(fā)的,我們還需要處理還未被清理的內(nèi)存管理單元

標(biāo)記階段 (STW)

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

  • 恢復(fù)執(zhí)行程序,標(biāo)記進(jìn)程和用于協(xié)助的用戶程序會(huì)開始并發(fā)標(biāo)記內(nèi)存中的對(duì)象,寫屏障會(huì)將被覆蓋的指針和新指針都標(biāo)記成灰色,而所有新創(chuàng)建的對(duì)象都會(huì)被直接標(biāo)記成黑色

  • 開始掃描根對(duì)象,包括所有 Goroutine 的棧、全局對(duì)象以及不在堆中的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu),掃描 Goroutine 棧期間會(huì)暫停當(dāng)前處理器

  • 依次處理灰色隊(duì)列中的對(duì)象,將對(duì)象標(biāo)記成黑色并將它們指向的對(duì)象標(biāo)記成灰色

  • 使用分布式的終止算法檢查剩余的工作,發(fā)現(xiàn)標(biāo)記階段完成后進(jìn)入標(biāo)記終止階段

標(biāo)記終止階段 (STW)

  • 暫停程序、將狀態(tài)切換至 _GCmarktermination 并關(guān)閉輔助標(biāo)記的用戶程序

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

清理階段

  • 將狀態(tài)切換至 _GCoff 開始清理階段,初始化清理狀態(tài)并關(guān)閉寫屏障

  • 恢復(fù)用戶程序,所有新創(chuàng)建的對(duì)象會(huì)標(biāo)記成白色

  • 后臺(tái)并發(fā)清理所有的內(nèi)存管理單元,當(dāng) Goroutine 申請(qǐng)新的內(nèi)存管理單元時(shí)就會(huì)觸發(fā)清理

1.2 三色標(biāo)記法

三色標(biāo)記算法將程序中的對(duì)象分成白色、黑色和灰色三類:

  • 白色對(duì)象 — 潛在的垃圾,其內(nèi)存可能會(huì)被垃圾收集器回收

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

  • 灰色對(duì)象 — 活躍的對(duì)象,因?yàn)榇嬖谥赶虬咨珜?duì)象的外部指針,垃圾收集器會(huì)掃描這些對(duì)象的子對(duì)象

三色標(biāo)記垃圾收集器的工作原理很簡(jiǎn)單,可以將其歸納成以下幾個(gè)步驟:

  • 從灰色對(duì)象的集合中選擇一個(gè)灰色對(duì)象并將其標(biāo)記成黑色

  • 將黑色對(duì)象指向的所有對(duì)象都標(biāo)記成灰色,保證該對(duì)象和被該對(duì)象引用的對(duì)象都不會(huì)被回收

  • 重復(fù)上述兩個(gè)步驟直到對(duì)象圖中不存在灰色對(duì)象

go語(yǔ)言需不需要手動(dòng)管理內(nèi)存

關(guān)于“go語(yǔ)言需不需要手動(dòng)管理內(nèi)存”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“go語(yǔ)言需不需要手動(dòng)管理內(nèi)存”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

新聞標(biāo)題:go語(yǔ)言需不需要手動(dòng)管理內(nèi)存
網(wǎng)頁(yè)網(wǎng)址:http://www.rwnh.cn/article40/gopieo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、電子商務(wù)、域名注冊(cè)、網(wǎng)站內(nèi)鏈、小程序開發(fā)、網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
得荣县| 哈密市| 扶风县| 武定县| 石阡县| 南昌市| 青州市| 平原县| 宜都市| 荣成市| 岗巴县| 鄱阳县| 大荔县| 辽中县| 海丰县| 武冈市| 赤峰市| 故城县| 黄山市| 婺源县| 安福县| 江城| 呼图壁县| 康保县| 登封市| 林口县| 寻乌县| 织金县| 敖汉旗| 永清县| 古浪县| 绥滨县| 永年县| 文安县| 新丰县| 河西区| 兴海县| 鸡东县| 镇远县| 彭水| 额尔古纳市|