Go語言垃圾回收機制原理

1. 概述

????????垃圾回收是一種自動內存管理技術:通過檢測程序中不再使用的內存,并釋放這些內存供其他對象使用。

????????應用程序中會使用到兩種內存,分別為堆(Heap)和棧(Stack)。GC不負責回收棧內存,只負責回收堆內存。?函數執行完后,棧內存直接釋放,不需要GC回收;堆是程序共享的內存,需要GC進行回收。

????????在Go語言中,垃圾回收器通過標記-清除(Mark-Sweep)算法來實現對內存的管理。

2.?實現細節

(1) 標記階段: 垃圾回收器從根對象(具體見下面)開始,遍歷所有可達對象,將其標記為活動的或被引用的。根對象包括全局變量、靜態變量等。(具體見下面的三色標記法) 。

(2) 清除階段:垃圾回收器遍歷所有對象,將未被標記的對象(不可達對象)進行回收,其占用的內存空間標記為空閑狀態。

(3) 壓縮階段:垃圾回收器對內存進行壓縮,將所有空閑的內存空間合并成一個連續的內存塊,以便更高效地分配內存。

3. 根對象包括:

(1)?全局變量:存在于程序整個生命周期的變量。

(2)?執行棧:每個 goroutine 都包含自己的執行棧,執行棧上包含棧上的變量及指向堆內存區塊的指針。

(3)?寄存器:寄存器的值可能表示一個指針,指向堆內存區塊。

4. 三色標記法(go1.5垃圾回收原理)

? ? 相比于1.3的標記法,1.5的三色標記法優勢是無序STW(暫停程序),按以下步驟操作:

(1)?只要是該程序創建的對象,都標記為白色。

(2)?每次GC開始,從根對象開始遍歷所有對象,把遍歷到的對象從白色放到灰色集合。

(3)?遍歷灰色集合,將灰色對象引用到的對象,從白色集合放到灰色集合;然后將此灰色對象放到黑色集合。

(4)?重復第(3)步直到灰色集合為空。

(5)?回收所有白色標記的對象(垃圾回收)

5.?屏障機制

? ? 在標記階段過程中,應用程序可能會改變對象引用樹,導致 三色不變式 規則被破壞。所以需要添加屏障機制,保證三色不變式有效,主要兩個機制如下:

(1)?插入寫屏障:在A對象引用B對象時,B對象被標記為灰色。

(2)?刪除寫屏障:被刪除的對象如果為灰色或者白色,那么被標記為灰色

7.?垃圾回收的性能優化體現點

(1)?并行化:標記和清除階段可以并行執行,以提高垃圾回收的性能。

(2)?延遲清除:為了減少垃圾回收過程中的停頓時間,垃圾回收器采用延遲清除策略。即只有在內存壓力較大時才進行清除操作,以避免頻繁的垃圾回收。

(3)?懶惰標記:指只有在需要分配新對象時才進行標記操作。這樣可以減少不必要的標記工作,提高垃圾回收的性能。

(4)?內存壓縮:通過內存壓縮技術,可以減少內存碎片,提高內存分配和釋放的效率。

8.?總結

????????Go語言的垃圾回收機制是一種高效且可靠的內存管理方案。

? ? ? ? 通過采用標記-清除算法以及一系列性能優化策略,垃圾回收器能夠自動管理內存,避免內存泄漏和內存溢出等問題。

? ? ? ? 同時,Go語言的垃圾回收器還針對并發編程進行了優化,以減少對并發執行的影響。

參考文章:go垃圾回收機制(三色標記法)& 屏障機制_go三色標記法與讀寫屏障-CSDN博客

GO進階(5) 垃圾回收機制-騰訊云開發者社區-騰訊云?

百度安全驗證?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15313.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15313.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15313.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《計算機網絡微課堂》課程概述

? 課程介紹 本專欄主要是 B 站課程《計算機網絡微課堂》的文字版,作者是湖南科技大學的老師。 B 站地址:https://www.bilibili.com/video/BV1c4411d7jb 該課程好評如潮,包含理論課,實驗課,考研真題分析課&#xf…

Jenkins在windows上進行安裝

今天為了實現jmeter接口測試腳本的持續性集成安裝了jenkins,主要記錄jenkins的安裝和端口的修改。 前提條件:安裝了jdk,我本機安裝的jdk1.8。 1.下載jenkins安裝包 安裝jenkins我們需要先下載安裝包,可以通過下面的鏈接進行下載&a…

10分鐘用QEMU搭建嵌入式開發環境學習Linux

安裝依賴軟件 作者的使用的是ubuntu22.04版本。 sudo apt-get install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev ninja-build sudo apt-get install git-email sudo apt-get install libaio-dev libbluetooth-dev libcapstone-dev libbrlapi-dev libbz2-d…

JavaSE--基礎語法(第一期)

Java是一種優秀的程序設計語言,它具有令人賞心悅目的語法和易于理解的語義。不僅如此,Java還是一個有一系列計算機軟件和規范形成的技術體系,這個技術體系提供了完整的用于軟件開發和 跨平臺部署的支持環境,并廣泛應用于嵌入式系統…

基于Docker的ElasticSearch、Kibana服務搭建并開啟用戶鑒權

🏷?個人主頁:牽著貓散步的鼠鼠 🏷?系列專欄:云原生與服務部署專欄 🏷?個人學習筆記,若有缺誤,歡迎評論區指正 目錄 1. 前言 2. 服務搭建 2.1. 部署ElasticSearch 2.2. 部署Kibana 3. …

安全態勢管理的六大挑戰:態勢感知

德迅云安全鑒于如今的安全威脅不斷變幻,企業對實施態勢管理策略至關重要,可以讓安全團隊根據需要進行安全策略的動態調整。如果企業在研究構建態勢感知管理,需要特別關注以下六個方面的挑戰。 如果企業正在使用一個或多個平臺,那么…

java為什么main方法是主程序入口?已回答

答: 其實是C語言程序員規定的main,java程序才能通過main來進入程序,java程序是通過jvm虛擬機來運行的,其實main方法是可以修改的,C程序員來規定是main方法來進入主程序,還是其他方法進入主程序,…

IS-IS鏈路狀態數據庫

原理概述 一個OSPF鏈路狀態數據庫是若干條LSA的集合。與此相似,一個IS-IS鏈路狀態數據庫是由若干條LSP的集合。與OSPF鏈路狀態數據庫不同,IS-IS鏈路狀態數據庫有Level-1和Level-2之分。 在IS-IS協議中,每一條LSA都有一條剩余生存時間、一個…

[力扣題解] 417. 太平洋大西洋水流問題

題目&#xff1a;417. 太平洋大西洋水流問題 思路 代碼 (1) MyMothed // 符合條件的點 : 既可以到達左或上邊界&#xff0c;也可以到達右或下邊界&#xff1b; class Solution { private:int dir[4][2] {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};vector<vector<int>&g…

safetensors介紹

1 介紹 safetensors 是 Huggingface 推出的一種可靠、易移植的機器學習模型存儲格式&#xff0c;用于安全地存儲 Tensor&#xff0c;而且速度很快&#xff08;零拷貝&#xff09;。 safetensors 格式結構&#xff1a; 8 bytes&#xff1a;一個無符號的整數&#xff0c;表示…

Dubbo源碼及總結

Springboot整合Dubbo啟動解析Bean定義 根據springboot啟動原理&#xff0c;會先把啟動類下的所有類先進行解析bean定義&#xff0c;所以要先EnableDubbo這個注解&#xff0c;再根據這個注解里面的注解&#xff0c;可以知道import的兩個類DubboComponentScanRegistrar和DubboCo…

輸入一串字符,輸入想要字符串前*的個數n,判斷字符串前*的個數是大于n還是小于n,如果大于n則刪除多余的*其它保持不變,如果小于n,則字符串也保持不變

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void fun(char* a, int n) {int i 0, j 0, m 0,b0,c0;char* p;p a;//第一步&#xff0c;判斷字母前面有多少個*while (p[i] *){j;}printf("字母前*的個數%d\n",j);//求總的字符串長度while (a[m] !…

【全開源】沃德商協會管理系統源碼(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp開發的商協會系統&#xff0c;新一代數字化商協會運營管理系統&#xff0c;以“智慧化會員體系、智敏化內容運營、智能化活動構建”三大板塊為基點&#xff0c;實施功能全場景覆蓋&#xff0c;一站式解決商協會需求壁壘&#xff0c;有效快速建立…

護眼小貼士:學生如何正確使用臺燈?

隨著電子設備的普及和長時間的用眼&#xff0c;長時間盯著屏幕或學習&#xff0c;眼睛需要不斷調節焦距&#xff0c;導致眼睛肌肉疲勞&#xff0c;進而引發視力下降。這種現象在年輕一代甚至青少年中尤為普遍&#xff0c;這種疲勞狀態不僅影響眼睛的舒適度&#xff0c;還會導致…

linux配置防火墻端口

配置防火墻&#xff0c;添加或刪除端口&#xff0c;需要有root權限。 防火墻常用命令如下&#xff1a; 1.查看防火墻狀態&#xff1a; systemctl status firewalld active(running)&#xff1a;開啟狀態&#xff0c;正在運行中 inactive(dead)&#xff1a;關閉狀態&#xff…

十、OpenAI之視覺

視覺 學習怎樣使用視覺能力理解圖片 1. 介紹 GPT-4o和GPT-4 Turbo兩個模型都擁有視覺能力&#xff0c;這意味著模型可以接收圖片并回答關于圖片的問題。從歷史上看&#xff0c;語言模型系統被限制采用單一的文本輸入方式。 2. 快速開始 模型使用圖片主要有2種方式&#xff…

qml下拉條實現

qml下拉條實現 代碼結構 代碼結構 Rectangle里面嵌套一個Flickable&#xff0c;然后下面是一個Rectangle&#xff0c;作為滑動的區域&#xff0c;給最外層的Rectangle的y加一個屬性動畫。滑動區域寫好onPressed和Onrelease即可。 import QtQuick 2.15 import QtQuick.Control…

從《紅樓夢》的視角看大模型知識庫 RAG 服務的 Rerank 調優

背景介紹 在之前的文章 有道 QAnything 源碼解讀 中介紹了有道 RAG 的一個主要亮點在于對 Rerank 機制的重視。 從目前來看&#xff0c;Rerank 確實逐漸成為 RAG 的一個重要模塊&#xff0c;在這篇文章中就希望能講清楚為什么 RAG 服務需要 Rerank 機制&#xff0c;以及如何選…

Redisson-分布式鎖單Redis節點模式

Redisson-分布式鎖單Redis節點模式 為什么要用分布式鎖&#xff1f; 使用分布式鎖的主要目的是為了解決多線程或多進程并發訪問共享資源時可能出現的競爭條件和數據一致性問題。舉一些實際場?&#xff1a; 數據庫并發控制&#xff1a;在分布式系統中&#xff0c;多個節點同…

虛擬機上部署java微服務

在Windows服務器上安裝Ubuntu系統&#xff0c;先安裝虛擬機&#xff0c;然后再虛擬機上安裝Ubuntu系統 啟動虛擬機上的Ubuntu系統&#xff0c;然后安裝jdk。安裝好的Ubuntu系統是帶桌面版的&#xff0c;需要打開 “終端” 控制臺&#xff0c;通過命令行交互的方式部署程序&…