亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長(zhǎng)資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    golang 有g(shù)c嗎

    golang 有g(shù)c嗎

    GO的垃圾回收器

    go語(yǔ)言垃圾回收總體采用的是經(jīng)典的mark and sweep算法。 (推薦學(xué)習(xí):go)

    1.3版本以前,golang的垃圾回收算法都非常簡(jiǎn)陋,然后其性能也廣被詬病:go runtime在一定條件下(內(nèi)存超過(guò)閾值或定期如2min),暫停所有任務(wù)的執(zhí)行,進(jìn)行mark&sweep操作,操作完成后啟動(dòng)所有任務(wù)的執(zhí)行。

    在內(nèi)存使用較多的場(chǎng)景下,go程序在進(jìn)行垃圾回收時(shí)會(huì)發(fā)生非常明顯的卡頓現(xiàn)象(Stop The World)。在對(duì)響應(yīng)速度要求較高的后臺(tái)服務(wù)進(jìn)程中,這種延遲簡(jiǎn)直是不能忍受的!這個(gè)時(shí)期國(guó)內(nèi)外很多在生產(chǎn)環(huán)境實(shí)踐go語(yǔ)言的團(tuán)隊(duì)都或多或少踩過(guò)gc的坑。

    當(dāng)時(shí)解決這個(gè)問(wèn)題比較常用的方法是盡快控制自動(dòng)分配內(nèi)存的內(nèi)存數(shù)量以減少gc負(fù)荷,同時(shí)采用手動(dòng)管理內(nèi)存的方法處理需要大量及高頻分配內(nèi)存的場(chǎng)景。

    1.3版本開(kāi)始go team開(kāi)始對(duì)gc性能進(jìn)行持續(xù)的改進(jìn)和優(yōu)化,每個(gè)新版本的go發(fā)布時(shí)gc改進(jìn)都成為大家備受關(guān)注的要點(diǎn)。

    1.3版本中,go runtime分離了mark和sweep操作,和以前一樣,也是先暫停所有任務(wù)執(zhí)行并啟動(dòng)mark,mark完成后馬上就重新啟動(dòng)被暫停的任務(wù)了,而是讓sweep任務(wù)和普通協(xié)程任務(wù)一樣并行的和其他任務(wù)一起執(zhí)行。

    如果運(yùn)行在多核處理器上,go會(huì)試圖將gc任務(wù)放到單獨(dú)的核心上運(yùn)行而盡量不影響業(yè)務(wù)代碼的執(zhí)行。go team自己的說(shuō)法是減少了50%-70%的暫停時(shí)間。

    1.4版本(當(dāng)前最新穩(wěn)定版本)對(duì)gc的性能改動(dòng)并不多。1.4版本中runtime很多代碼取代了原生c語(yǔ)言實(shí)現(xiàn)而采用了go語(yǔ)言實(shí)現(xiàn),對(duì)gc帶來(lái)的一大改變是可以是實(shí)現(xiàn)精確的gc。

    c語(yǔ)言實(shí)現(xiàn)在gc時(shí)無(wú)法獲取到內(nèi)存的對(duì)象信息,因此無(wú)法準(zhǔn)確區(qū)分普通變量和指針,只能將普通變量當(dāng)做指針,如果碰巧這個(gè)普通變量指向的空間有其他對(duì)象,那這個(gè)對(duì)象就不會(huì)被回收。

    而go語(yǔ)言實(shí)現(xiàn)是完全知道對(duì)象的類(lèi)型信息,在標(biāo)記時(shí)只會(huì)遍歷指針指向的對(duì)象,這樣就避免了C實(shí)現(xiàn)時(shí)的堆內(nèi)存浪費(fèi)(解決約10-30%)。

    1.5版本go team對(duì)gc又進(jìn)行了比較大的改進(jìn)(1.4中已經(jīng)埋下伏筆如write barrier的引入),官方的主要目標(biāo)是減少延遲。go 1.5正在實(shí)現(xiàn)的垃圾回收器是“非分代的、非移動(dòng)的、并發(fā)的、三色的標(biāo)記清除垃圾收集器”。

    分代算法上文已經(jīng)提及,是一種比較好的垃圾回收管理策略,然1.5版本中并未考慮實(shí)現(xiàn);我猜測(cè)的原因是步子不能邁太大,得逐步改進(jìn),go官方也表示會(huì)在1.6版本的gc優(yōu)化中考慮。

    同時(shí)引入了上文介紹的三色標(biāo)記法,這種方法的mark操作是可以漸進(jìn)執(zhí)行的而不需每次都掃描整個(gè)內(nèi)存空間,可以減少stop the world的時(shí)間。

    由此可以看到,一路走來(lái)直到1.5版本,go的垃圾回收性能也是一直在提升,但是相對(duì)成熟的垃圾回收系統(tǒng)(如java jvm和javascript v8),go需要優(yōu)化的路徑還很長(zhǎng)(但是相信未來(lái)一定是美好的~)。

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)