91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go語言有沒有gc

發布時間:2022-11-25 09:46:19 來源:億速云 閱讀:149 作者:iii 欄目:編程語言

這篇文章主要介紹“go語言有沒有gc”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“go語言有沒有gc”文章能幫助大家解決問題。

go語言有gc。GC是指垃圾回收,是一種自動內存管理的機制;go語言支持GC,Go中對象內存空間的回收是通過GC機制來完成的。對于Go而言,Go的GC使用的是無分代(對象沒有代際之分)、不整理(回收過程中不對對象進行移動與整理)、并發(與用戶代碼并發執行)的三色標記清掃算法。

GC機制是在Java語言被廣泛使用之后所火起來的,像后來的腳本語言Python都支持GC,GO也支持GC。

Go語言和C/C++語言的一個顯著的特點是Go中對象內存空間的回收是通過GC機制來完成的,不需要像C++一樣通過程序員的手動申請和釋放,所以Go中相對不容易出現內存泄漏。今天我們就來聊聊Go中的GC機制。

什么是GC,又有什么用?

GC,全稱 Garbage Collection,即垃圾回收,是一種自動內存管理的機制。

當程序向操作系統申請的內存不再需要時,垃圾回收主動將其回收并供其他代碼進行內存申請時候復用,或者將其歸還給操作系統,這種針對內存級別資源的自動回收過程,即為垃圾回收。而負責垃圾回收的程序組件,即為垃圾回收器。

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

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

  • 賦值器(Mutator):這一名稱本質上是在指代用戶態的代碼。因為對垃圾回收器而言,用戶態的代碼僅僅只是在修改對象之間的引用關系,也就是在對象圖(對象之間引用關系的一個有向圖)上進行操作。

  • 回收器(Collector):負責執行垃圾回收的代碼。

GC中的根對象

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

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

  • 執行棧:每個 goroutine 都包含自己的執行棧,這些執行棧上包含棧上的變量及指向分配的堆內存區塊的指針。

  • 寄存器:寄存器的值可能表示一個指針,參與計算的這些指針可能指向某些賦值器分配的堆內存區塊。

GC的實現方式

所有的 GC 算法其存在形式可以歸結為追蹤(Tracing)和引用計數(Reference Counting)這兩種形式的混合運用。

  • 追蹤式 GC

    從根對象出發,根據對象之間的引用信息,一步步推進直到掃描完畢整個堆并確定需要保留的對象,從而回收所有可回收的對象。Go、 Java、V8 對 JavaScript 的實現等均為追蹤式 GC。

  • 引用計數式 GC

    每個對象自身包含一個被引用的計數器,當計數器歸零時自動得到回收。因為此方法缺陷較多,在追求高性能時通常不被應用。Python、Objective-C 等均為引用計數式 GC。

目前比較常見的 GC 實現方式包括:

  • 追蹤式,分為多種不同類型,例如:

    • 標記清掃:從根對象出發,將確定存活的對象進行標記,并清掃可以回收的對象。

    • 標記整理:為了解決內存碎片問題而提出,在標記過程中,將對象盡可能整理到一塊連續的內存上。

    • 增量式:將標記與清掃的過程分批執行,每次執行很小的部分,從而增量的推進垃圾回收,達到近似實時、幾乎無停頓的目的。

    • 增量整理:在增量式的基礎上,增加對對象的整理過程。

    • 分代式:將對象根據存活時間的長短進行分類,存活時間小于某個值的為年輕代,存活時間大于某個值的為老年代,永遠不會參與回收的對象為永久代。并根據分代假設(如果一個對象存活時間不長則傾向于被回收,如果一個對象已經存活很長時間則傾向于存活更長時間)對對象進行回收。

  • 引用計數:根據對象自身的引用計數來回收,當引用計數歸零時立即回收。

Go中GC的實現方式

對于 Go 而言,Go 的 GC 使用的是無分代(對象沒有代際之分)、不整理(回收過程中不對對象進行移動與整理)、并發(與用戶代碼并發執行)的三色標記清掃算法。

原因如下:

  • 對象整理的優勢是解決內存碎片問題以及“允許”使用順序內存分配器。但 Go 運行時的分配算法基于 tcmalloc,基本上沒有碎片問題。并且順序內存分配器在多線程的場景下并不適用。Go 使用的是基于 tcmalloc 的現代內存分配算法,對對象進行整理不會帶來實質性的性能提升。

  • 分代 GC 依賴分代假設,即 GC 將主要的回收目標放在新創建的對象上(存活時間短,更傾向于被回收),而非頻繁檢查所有對象。但 Go 的編譯器會通過逃逸分析將大部分新生對象存儲在棧上(棧直接被回收),只有那些需要長期存在的對象才會被分配到需要進行垃圾回收的堆中。也就是說,分代 GC 回收的那些存活時間短的對象在 Go 中是直接被分配到棧上,當 goroutine 死亡后棧也會被直接回收,不需要 GC 的參與,進而分代假設并沒有帶來直接優勢。并且 Go 的垃圾回收器與用戶代碼并發執行,使得 STW 的時間與對象的代際、對象的 size 沒有關系。Go 團隊更關注于如何更好地讓 GC 與用戶代碼并發執行(使用適當的 CPU 來執行垃圾回收),而非減少停頓時間這一單一目標上。

關于“go語言有沒有gc”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節
推薦閱讀:
  1. php gc
  2. java GC筆記

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

会泽县| 观塘区| 兰州市| 洱源县| 昔阳县| 宁强县| 岳阳县| 马鞍山市| 怀宁县| 三明市| 临潭县| 凤山县| 宁陵县| 武安市| 靖西县| 修文县| 红河县| 弥渡县| 赞皇县| 苏尼特右旗| 宜城市| 呼和浩特市| 丽江市| 彝良县| 珲春市| 阿坝县| 离岛区| 通江县| 永川市| 桐城市| 沙洋县| 永泰县| 永修县| 闻喜县| 越西县| 阳曲县| 贵德县| 伊春市| 柘城县| 曲靖市| 望谟县|