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

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

    go語言需要手動管理內(nèi)存嗎

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

    go語言需要手動管理內(nèi)存嗎

    php入門到就業(yè)線上直播課:進(jìn)入學(xué)習(xí)
    Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調(diào)試工具:點(diǎn)擊使用

    本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。

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

    什么是GC,又有什么用?

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

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

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

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

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

    • 賦值器(Mutator):這一名稱本質(zhì)上是在指代用戶態(tài)的代碼。因?yàn)閷厥掌鞫裕脩魬B(tài)的代碼僅僅只是在修改對象之間的引用關(guān)系,也就是在對象圖(對象之間引用關(guān)系的一個有向圖)上進(jìn)行操作。

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

    GC中的根對象

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

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

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

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

    垃圾回收

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

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

    go語言需要手動管理內(nèi)存嗎

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

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

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

    go語言需要手動管理內(nèi)存嗎

    清除終止階段

    • 暫停程序,所有的處理器在這時會進(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ì)

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

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

    • 依次處理灰色隊(duì)列中的對象,將對象標(biāo)記成黑色并將它們指向的對象標(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)建的對象會標(biāo)記成白色

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

    1.2 三色標(biāo)記法

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

    • 白色對象 — 潛在的垃圾,其內(nèi)存可能會被垃圾收集器回收
    • 黑色對象 — 活躍的對象,包括不存在任何引用外部指針的對象以及從根對象可達(dá)的對象
    • 灰色對象 — 活躍的對象,因?yàn)榇嬖谥赶虬咨珜ο蟮耐獠恐羔槪占鲿呙柽@些對象的子對象

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

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

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

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

    go語言需要手動管理內(nèi)存嗎

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