真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語(yǔ)言中主動(dòng)垃圾回收 golang 垃圾回收機(jī)制

golang可執(zhí)行文件執(zhí)行完后自刪除

是。在golang軟件中,可執(zhí)行文件執(zhí)行完后是為了清除垃圾,是會(huì)自動(dòng)刪除的。golang是一種靜態(tài)強(qiáng)類型、編譯型、并發(fā)型,并具有垃圾回收功能的編程語(yǔ)言。

創(chuàng)新互聯(lián)建站是專業(yè)的定南網(wǎng)站建設(shè)公司,定南接單;提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行定南網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

go的垃圾回收算法

從Gov1.12版本開(kāi)始,Go使用了非分代的、并發(fā)的、基于三色標(biāo)記清除的垃圾回收器。

關(guān)于垃圾回收,比較常見(jiàn)的算法有引用計(jì)數(shù)、標(biāo)記清除和分代收集,Golang語(yǔ)言使用的垃圾回收算法是標(biāo)記清除。

Golang語(yǔ)言的標(biāo)記清除垃圾回收算法,為了防止GC掃描時(shí)內(nèi)存變化引起的混亂。那么就需要 STW,即Stop The World。具體在Golang語(yǔ)言中是指,在GC時(shí)先停止所有g(shù)oroutine。再進(jìn)行垃圾回收,等待垃圾回收結(jié)束后再恢復(fù)所有被停止的goroutine。

標(biāo)記清除方法

啟動(dòng)STW,暫停程序的業(yè)務(wù)邏輯,找出不可達(dá)對(duì)象和可達(dá)對(duì)象。

將所有可達(dá)對(duì)象做標(biāo)記,清除未標(biāo)記的對(duì)象。停止STW,程序繼續(xù)執(zhí)行。循環(huán)往復(fù),直到進(jìn)程程序生命周期結(jié)束。因?yàn)镾TW需要暫停程序,為了減少暫停程序的時(shí)間。將清除操作移出 STW執(zhí)行周期,但是優(yōu)化效果不明顯。

所謂三色標(biāo)記,實(shí)際上只是為了方便敘述而抽象出來(lái)的一種說(shuō)法,三色對(duì)應(yīng)垃圾回收過(guò)程中對(duì)象的三種狀態(tài)。白色是對(duì)象未被標(biāo)記,gcmarkBits對(duì)應(yīng)位為0,該對(duì)象將會(huì)在本次GC中被清理?;疑菍?duì)象還在標(biāo)記隊(duì)列中等待被標(biāo)記,黑色是對(duì)象已被標(biāo)記,gcmarkBits對(duì)應(yīng)位為0,該對(duì)象將會(huì)在本次 GC中被回收。

Golang什么時(shí)候會(huì)觸發(fā)GC

Golang采用了三色標(biāo)記法來(lái)進(jìn)行垃圾回收,那么在什么場(chǎng)景下會(huì)觸發(fā)這個(gè)回收動(dòng)作呢?

源碼主要位于文件 src/runtime/mgc.go go version 1.16

觸發(fā)條件從大方面說(shuō),可分為 手動(dòng)觸發(fā) 和 系統(tǒng)觸發(fā) 兩種方式。手動(dòng)觸發(fā)一般很少用,主要由開(kāi)發(fā)者通過(guò)調(diào)用 runtime.GC() 函數(shù)來(lái)實(shí)現(xiàn),而對(duì)于系統(tǒng)自動(dòng)觸發(fā)是 運(yùn)行時(shí) 根據(jù)一些條件判斷來(lái)進(jìn)行的,這也正是本文要介紹的內(nèi)容。

不管哪種觸發(fā)方式,底層回收機(jī)制是一樣的,所以我們先看一下手動(dòng)觸發(fā),根據(jù)它來(lái)找系統(tǒng)觸發(fā)的條件。

可以看到開(kāi)始執(zhí)行GC的是 gcStart() 函數(shù),它有一個(gè) gcTrigger 參數(shù),是一個(gè)觸發(fā)條件結(jié)構(gòu)體,它的結(jié)構(gòu)體也很簡(jiǎn)單。

其實(shí)在Golang 內(nèi)部所有的GC都是通過(guò) gcStart() 函數(shù),然后指定一個(gè) gcTrigger 的參數(shù)來(lái)開(kāi)始的,而手動(dòng)觸發(fā)指定的條件值為 gcTriggerCycle 。 gcStart 是一個(gè)很復(fù)雜的函數(shù),有興趣的可以看一下源碼實(shí)現(xiàn)。

對(duì)于 kind 的值有三種,分別為 gcTriggerHeap 、 gcTriggerTime 和 gcTriggerCycle 。

運(yùn)行時(shí)會(huì)通過(guò) gcTrigger.test() 函數(shù)來(lái)決定是否需要觸發(fā)GC,只要滿足上面基中一個(gè)即可。

到此我們基本明白了這三種觸發(fā)GC的條件,那么對(duì)于系統(tǒng)自動(dòng)觸發(fā)這種,Golang 從一個(gè)程序的開(kāi)始到運(yùn)行,它又是如何一步一步監(jiān)控到這個(gè)條件的呢?

其實(shí) runtime 在程序啟動(dòng)時(shí),會(huì)在一個(gè)初始化函數(shù) init() 里啟用一個(gè) forcegchelper() 函數(shù),這個(gè)函數(shù)位于 proc.go 文件。

為了減少系統(tǒng)資源占用,在 forcegchelper 函數(shù)里會(huì)通過(guò) goparkunlock() 函數(shù)主動(dòng)讓自己陷入休眠,以后由 sysmon() 監(jiān)控線程根據(jù)條件來(lái)恢復(fù)這個(gè)gc goroutine。

可以看到 sysmon() 會(huì)在一個(gè) for 語(yǔ)句里一直判斷這個(gè) gcTriggerTime 這個(gè)條件是否滿足,如果滿足的話,會(huì)將 forcegc.g 這個(gè) goroutine 添加到全局隊(duì)列里進(jìn)行調(diào)度(這里 forcegc 是一個(gè)全局變量)。

調(diào)度器在調(diào)度循環(huán) runtime.schedule 中還可以通過(guò)垃圾收集控制器的 runtime.gcControllerState.findRunnabledGCWorker 獲取并執(zhí)行用于后臺(tái)標(biāo)記的任務(wù)。

Go語(yǔ)言有什么優(yōu)勢(shì)?

GO語(yǔ)言的優(yōu)勢(shì):可直接編譯成機(jī)器碼,不依賴其他庫(kù),glibc的版本有一定要求,部署就是扔一個(gè)文件上去就完成了。靜態(tài)類型語(yǔ)言,但是有動(dòng)態(tài)語(yǔ)言的感覺(jué),靜態(tài)類型的語(yǔ)言就是可以在編譯的時(shí)候檢查出來(lái)隱藏的大多數(shù)問(wèn)題,動(dòng)態(tài)語(yǔ)言的感覺(jué)就是有很多的包可以使用,寫(xiě)起來(lái)的效率很高。語(yǔ)言層面支持并發(fā),這個(gè)就是Go最大的特色,天生的支持并發(fā),我曾經(jīng)說(shuō)過(guò)一句話,天生的基因和整容是有區(qū)別的,大家一樣美麗,但是你喜歡整容的還是天生基因的美麗呢?Go就是基因里面支持的并發(fā),可以充分的利用多核,很容易的使用并發(fā)。內(nèi)置runtime,支持垃圾回收,這屬于動(dòng)態(tài)語(yǔ)言的特性之一吧,雖然目前來(lái)說(shuō)GC不算完美,但是足以應(yīng)付我們所能遇到的大多數(shù)情況,特別是Go1.1之后的GC。簡(jiǎn)單易學(xué),Go語(yǔ)言的作者都有C的基因,那么Go自然而然就有了C的基因,那么Go關(guān)鍵字是25個(gè),但是表達(dá)能力很強(qiáng)大,幾乎支持大多數(shù)你在其他語(yǔ)言見(jiàn)過(guò)的特性:繼承、重載、對(duì)象等。豐富的標(biāo)準(zhǔn)庫(kù),Go目前已經(jīng)內(nèi)置了大量的庫(kù),特別是網(wǎng)絡(luò)庫(kù)非常強(qiáng)大,我最愛(ài)的也是這部分。內(nèi)置強(qiáng)大的工具,Go語(yǔ)言里面內(nèi)置了很多工具鏈,最好的應(yīng)該是gofmt工具,自動(dòng)化格式化代碼,能夠讓團(tuán)隊(duì)review變得如此的簡(jiǎn)單,代碼格式一模一樣,想不一樣都很困難??缙脚_(tái)編譯,如果你寫(xiě)的Go代碼不包含cgo,那么就可以做到window系統(tǒng)編譯linux的應(yīng)用,如何做到的呢?Go引用了plan9的代碼,這就是不依賴系統(tǒng)的信息。Go語(yǔ)言這么多的優(yōu)勢(shì),你還不想學(xué)嗎?我記得當(dāng)時(shí)我看的是黑馬程序員的視頻,我對(duì)他們視頻的印象就是通俗易懂,就是好!


當(dāng)前名稱:go語(yǔ)言中主動(dòng)垃圾回收 golang 垃圾回收機(jī)制
本文來(lái)源:http://weahome.cn/article/dohjdpj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部