內存管理策略,在業務進程運行的過程中,由垃圾收集器以類似守護協程的方式在后臺運行,按照指定策略回收不再被使用的對象,釋放內存空間進行回收
優勢:
屏蔽內存回收的細節:屏蔽復雜的內存管理工作,更好聚焦于業務邏輯
以全局視野執行任務:全局管理臨界資源的使用
劣勢:
提高下限但降低了上限:失去控制主權,除運用有限的GC調優參數外,更多的自由度都被閹割,需要向系統看起,服從設定
增加額外成本:需要額外的狀態信息用以存儲全局的內存使用情況,有時需要中斷整個程序用以支持垃圾回收工作
垃圾回收算法
標記清掃
可達對象:對象和對象之間通過指針記錄依賴關系,通過指針依賴的路徑實現標記,從根對象出發將所能達到的對象全部進行標記
不可達對象:清掃完一輪后,剩下沒有被標記的對象,代表不在被使用方所關心,就可以對內存進行回收
標記:標記出當前還存活的對象
清掃:清掃到未被標記到的垃圾對象
類似于排除法的間接思路,不直接查找垃圾對象,而是標記存活對象,取補集推斷出垃圾對象
會產生內部碎片,因為清掃后,空閑的內存塊可能零星碎片化分布,對大對象需要分配內存,可能會因為無法化零為整導致分配失敗
標記壓縮
在標記清掃的基礎上進行壓縮,在清掃的同時,對還存活對象進行壓縮整合,將已使用的內存塊進行位置的轉移,壓縮在一起使得更加緊湊
半空間復制
以空間換時間
分配兩片大小相等的空間fromspace和tospace
每輪只使用fromspace空間(正常分配內存),以GC作為分水嶺劃分輪次
GC時,將fromspace存活對象轉移到tospace中,進行空間壓縮整合
GC后交換fromspace和tospace,開啟新輪次
引用計數
對象每被其他對象引用一次,計數器加1
每被刪除引用一次,計數器減1
GC時,把計數器等于0的對象刪除,不在被用戶需要
無法解決循環引用或自引用問題
Golang垃圾回收
并發三色標記法+混合寫屏障機制
三色標記法
屬于標記清掃算法的一種實現
對象分為:黑白灰
從穩定的根對象出發
黑:對象自身存活,且指向對象都已標記完成
白:對象尚未被標記到,可能是垃圾對象
灰:對象自身存活,其指向對象還未標記完成
標記開始前,將根對象(全局對象,棧上局部變量等)置黑,將其所指向的對象置灰
標記規則是,從灰對象出發,將其所執行的對象都置灰,之后對當前灰對象置黑
標記結束后,白對象就是不可達的垃圾對象,進行清掃