淺嘗Go語言GC

大家好,我是小棧君催烘,因為個人和工作的緣故,所以拖更了一點時間缎罢,但是關(guān)于拖更的內(nèi)容小棧君會在后續(xù)的時間中補回來伊群,還希望大家繼續(xù)支持和關(guān)注小棧君喳钟。當(dāng)然,在國內(nèi)疫情稍微減緩的情況下在岂,小棧君在這里也多說兩句奔则,在非常時刻,我們應(yīng)當(dāng)保持警惕蔽午,清洗手易茬,多通風(fēng),避免人群聚集及老,希望大家平安健康抽莱,

閑話不多說,我們直接進(jìn)入正題骄恶,今天給大家分享的事關(guān)于Go語言中的GC食铐,本期的分享并沒有多少代碼可言,都是一些理論知識僧鲁,希望大家耐心且看完虐呻,因為能力有限,所以這邊小棧君會盡量用大白話來進(jìn)行敘述寞秃,如有錯誤之處斟叼,還請多多諒解。

GC含義:

對于編程有經(jīng)驗的同學(xué)應(yīng)該都知道GC春寿,他的英文全稱是garbage collector 朗涩,也就是我們通常所說的垃圾收集器。其實Go語言的垃圾收集器是相對于C++語言有十分重要的改進(jìn)绑改,針對于開發(fā)過C++的同學(xué)或是大學(xué)的時候?qū)W習(xí)的C++知識而言的話谢床,我們應(yīng)該知道在C++語言中創(chuàng)建對象分配空間后需要手動釋放,針對于手動釋放的情況下厘线,有時候我們很難去進(jìn)行判斷什么時候需要识腿,在編程的難度方面無疑是大大增加了難度。

GO語言GC的發(fā)展:

Go語言的GC問題皆的,其實經(jīng)歷過多個版本的迭代覆履,并非一蹴而就,就像我們做編程的一樣并非一生下來就會费薄。他也是經(jīng)歷過一定時間的發(fā)展史硝全。在1.1版本的時候Go語言采用的STW也就是stop the word,也就是我們常說的標(biāo)記清掃的方式楞抡,在此期間容器是不會執(zhí)行我們的應(yīng)用程序伟众,所以也會被人所詬病。在Go語言1.3版本之后召廷,Go語言的團(tuán)隊進(jìn)行分離了標(biāo)記和清楚的操作凳厢,使用了協(xié)程進(jìn)行并發(fā)執(zhí)行清理账胧,也就是在標(biāo)記的時候進(jìn)行Mark STW,sweep的時候并發(fā)執(zhí)行先紫。它所代表的的執(zhí)行過程大致如下:在進(jìn)行GC的時候治泥,Go語言會首先停止運行我們的程序,進(jìn)行遞歸遍歷對象遮精,進(jìn)行標(biāo)記居夹,標(biāo)記完成之后將所有沒有引用的對象進(jìn)行清理。由于標(biāo)記會進(jìn)行程序的停止本冲,所以當(dāng)對象特別多的時候標(biāo)記和清理的時間就會相對的延長(有可能是幾百毫秒)准脂,對于大型的項目而言無疑是很難受的。
所以在Go語言的1.5版本中針對于標(biāo)記和清理算法的改進(jìn)檬洞,引入了三色標(biāo)記法狸膏。從邏輯上進(jìn)行劃分為幾大區(qū)域,白色區(qū)域[未搜索]添怔、灰色區(qū)域[正搜索]湾戳、黑色區(qū)域[已搜索]。
其運行的原理大致如下:

file

程序運行之初澎灸,針對于創(chuàng)建的對象都作為白色的標(biāo)記院塞。然后當(dāng)我們的GC開始的時候,我們將所有可達(dá)的對象都標(biāo)記為灰色

file

然后標(biāo)記為黑色之后性昭,在以灰色為基點進(jìn)行可達(dá)分析,找到其引用的對象县遣,然后將其引用的對象標(biāo)記為灰色糜颠,自己則變成黑色。

file

依次進(jìn)行循環(huán)萧求,最終將所有可達(dá)的對象標(biāo)記為黑色其兴,以便于系統(tǒng)區(qū)分。

file

然后系統(tǒng)再回收白色未標(biāo)記的對象夸政,釋放內(nèi)存元旬。

file

大體的三色標(biāo)記法的過程就是這樣。當(dāng)然Go語言的團(tuán)隊每次的更新都會對GC算法進(jìn)行優(yōu)化守问,比如在golang1.5版本的時候支持了并發(fā)的收集匀归,在1.8的時候已經(jīng)將STW的時間優(yōu)化到了100微妙。通常來講在我們應(yīng)用程序上一次時間只需要10微妙耗帕,而且在1.10版本之后再次減少了GC對于CPU的使用率穆端。

當(dāng)然值得注意一點的是,和java程序一樣程序?qū)τ贕C的這個動作是自發(fā)進(jìn)行的仿便。在下列的情況下會進(jìn)行觸發(fā)GC体啰。一種情況是程序申請內(nèi)存空間時攒巍,發(fā)現(xiàn)GC是上次GC的兩倍,另一種情況是程序在運行過程中荒勇,每2分鐘會進(jìn)行GC的觸發(fā)柒莉。

GC的調(diào)優(yōu)

這里小棧君粗略的講解一下關(guān)于GC的調(diào)優(yōu)吧,第一是我們在程序編寫的過程中沽翔,要做到盡量的小對象復(fù)用常柄,針對于局部變量盡量少去聲明,針對于多個小對象的情況我們可以用一個結(jié)構(gòu)體進(jìn)行包裝搀擂,方便GC的掃描西潘。其次就是少用string的“+進(jìn)行字符串的拼接。
最后在go源碼中也有對于GC的相關(guān)描述:

file

file

file

file

file

在runtime包中哨颂,這里團(tuán)隊寫了關(guān)于GC的詳細(xì)流程喷市,包括GC率和標(biāo)記方式等等,感興趣的朋友可以下來看一下威恼,如果英文不是很好的話品姓,可以自行搜索翻譯,哈哈哈哈箫措。

好了腹备,今天的淺嘗分析go語言的GC就先到這里了,如果你喜歡我的分享斤蔓,還請記得多多轉(zhuǎn)發(fā)植酥,點贊,我是小棧君弦牡,我們下期分享再見~友驮,拜了個拜

本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驾锰,一起剝皮案震驚了整個濱河市卸留,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌椭豫,老刑警劉巖耻瑟,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赏酥,居然都是意外死亡喳整,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門今缚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來算柳,“玉大人,你說我怎么就攤上這事姓言∷蚕睿” “怎么了蔗蹋?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長囱淋。 經(jīng)常有香客問我猪杭,道長,這世上最難降的妖魔是什么妥衣? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任皂吮,我火速辦了婚禮,結(jié)果婚禮上税手,老公的妹妹穿的比我還像新娘蜂筹。我一直安慰自己,他們只是感情好芦倒,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布艺挪。 她就那樣靜靜地躺著,像睡著了一般兵扬。 火紅的嫁衣襯著肌膚如雪麻裳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天器钟,我揣著相機(jī)與錄音津坑,去河邊找鬼。 笑死傲霸,一個胖子當(dāng)著我的面吹牛疆瑰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播狞谱,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼乃摹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了跟衅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤播歼,失蹤者是張志新(化名)和其女友劉穎伶跷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秘狞,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡叭莫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了烁试。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雇初。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖减响,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤问慎,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布闰挡,位于F島的核電站,受9級特大地震影響庵朝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一攒庵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧败晴,春花似錦浓冒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至糖驴,卻和暖如春僚祷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贮缕。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工辙谜, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人感昼。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓装哆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親定嗓。 傳聞我的和親對象是個殘疾皇子蜕琴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容