最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#垃圾回收用法(GC)通俗易懂版

 更新時(shí)間:2025年06月17日 10:07:04   作者:終不似少年游啊  
這篇文章主要介紹了C#垃圾回收用法(GC),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

C# 的垃圾回收(Garbage Collection,簡(jiǎn)稱 GC)機(jī)制是 .NET 運(yùn)行時(shí)(CLR)的一部分,用于自動(dòng)管理內(nèi)存,避免程序員手動(dòng)釋放內(nèi)存帶來(lái)的問(wèn)題(如內(nèi)存泄漏、懸掛指針等)。

底層實(shí)現(xiàn)由 CLR 的 GC 引擎負(fù)責(zé),具有高效、安全、并發(fā)、分代等特點(diǎn)。

一、為什么需要GC?

想象你的程序是一座繁忙的倉(cāng)庫(kù):

  • 每執(zhí)行 new Person() 就在倉(cāng)庫(kù)中存放一個(gè)“貨物”(對(duì)象)
  • 變量(如 person1)是綁在貨物上的“繩子”(引用)
  • 問(wèn)題:貨物不再使用后,若不清理,倉(cāng)庫(kù)遲早爆滿 → 程序崩潰!

C#的GC就是自動(dòng)化倉(cāng)庫(kù)管理員,默默幫你清掃垃圾、整理貨架,徹底告別C/C++時(shí)代的手動(dòng)delete之痛。

二、GC核心四步工作流(超簡(jiǎn)化版)

1. 暫停世界(Stop-The-World)

  • GC發(fā)出指令:“所有線程立刻凍結(jié)!”
  • 目的:防止標(biāo)記過(guò)程中對(duì)象狀態(tài)被修改,確保數(shù)據(jù)一致性。

2. 標(biāo)記階段(Mark):誰(shuí)還在用?

根對(duì)象(Roots) 出發(fā):

  • 靜態(tài)變量(墻上固定的掛鉤)
  • 局部變量(操作臺(tái)上的臨時(shí)掛鉤)
  • CPU寄存器中的引用(管理員手中的繩子)

深度追蹤

  • 沿著每根“繩子”找到對(duì)象,再檢查對(duì)象內(nèi)部的引用(如person1.Dog),像波浪一樣擴(kuò)散標(biāo)記所有可達(dá)對(duì)象,并打上“存活”標(biāo)簽。

3. 清掃階段(Sweep):扔掉垃圾

  • 遍歷整個(gè)堆內(nèi)存(倉(cāng)庫(kù))
  • 所有未被標(biāo)記的對(duì)象 → 直接回收其內(nèi)存!
  • (無(wú)任何引用指向 = 程序永遠(yuǎn)無(wú)法訪問(wèn) = 安全刪除)

4. 壓縮階段(Compact):整理碎片

// 壓縮前:內(nèi)存碎片化(空閑但分散)
[對(duì)象A][空閑][對(duì)象B][空閑][對(duì)象C]
// 壓縮后:對(duì)象緊密排列
[對(duì)象A][對(duì)象B][對(duì)象C][大塊連續(xù)空閑空間]
  • 移動(dòng)存活對(duì)象到連續(xù)地址
  • 更新所有引用(確保“繩子”指向新位置)
  • 關(guān)鍵作用:避免內(nèi)存碎片,提升后續(xù)分配效率!

三、GC高效秘密武器:分代回收(Generations)

洞察規(guī)律

“越新的對(duì)象,越容易變成垃圾;活得越久,越可能長(zhǎng)壽。”

.NET將堆內(nèi)存分為三代

代際對(duì)象特點(diǎn)GC檢查頻率回收成本
Gen0新創(chuàng)建的小對(duì)象(如臨時(shí)變量)非常高
Gen1經(jīng)歷1次GC仍存活的對(duì)象中等
Gen2長(zhǎng)期存活對(duì)象(如全局緩存)非常低

工作策略

  • 新對(duì)象默認(rèn)進(jìn)入Gen0
  • Gen0滿 → 觸發(fā)GC(僅回收Gen0,速度極快)
  • Gen0存活對(duì)象晉升Gen1
  • Gen1滿 → 回收Gen0+Gen1
  • Gen2滿 → 完全GC(回收所有代,性能影響大)

優(yōu)勢(shì):90%的垃圾在Gen0被回收,避免頻繁掃描老對(duì)象!

四、對(duì)開發(fā)者的關(guān)鍵啟示

1. 無(wú)需手動(dòng)釋放,但需“斷開引用”

讓對(duì)象變垃圾的正確方式:

// 方法1:引用置空
person1 = null; 

// 方法2:超出作用域(局部變量自動(dòng)失效)
void CreateTempObject() {
    var temp = new Object(); // 函數(shù)結(jié)束 → temp引用消失
}

// 方法3:重新賦值
person1 = new Person(); // 原對(duì)象失去引用

2. 特殊資源需手動(dòng)釋放!

GC只回收內(nèi)存!文件句柄、數(shù)據(jù)庫(kù)連接等需通過(guò)IDisposable主動(dòng)釋放:

// 正確姿勢(shì):using自動(dòng)調(diào)用Dispose()
using (var file = File.Open("test.txt")) 
{
    // 操作文件...
} // 離開區(qū)域自動(dòng)關(guān)閉文件!

// 等價(jià)于手動(dòng)try-finally
try {
    var file = File.Open("test.txt");
    // ...
} finally {
    file?.Dispose();
}

3. 性能敏感場(chǎng)景優(yōu)化建議

  • 避免高頻創(chuàng)建臨時(shí)對(duì)象(如循環(huán)內(nèi)new
  • 慎用GC.Collect()(強(qiáng)制GC可能引發(fā)卡頓)
  • 大對(duì)象用Large Object Heap(避免Gen0碎片)
  • 值類型(struct)優(yōu)先(分配在棧,無(wú)GC壓力)

五、總結(jié)

GC如何改變編程?

傳統(tǒng)語(yǔ)言(C/C++)C#/Java(帶GC)
手動(dòng)malloc/free自動(dòng)創(chuàng)建回收
內(nèi)存泄漏風(fēng)險(xiǎn)高泄漏概率大幅降低
野指針引發(fā)崩潰引用永遠(yuǎn)指向有效對(duì)象
開發(fā)效率低專注業(yè)務(wù)邏輯,生產(chǎn)力↑↑↑

GC哲學(xué):把內(nèi)存管理的臟活累活交給運(yùn)行時(shí),讓開發(fā)者更專注于創(chuàng)造價(jià)值!

附:GC觸發(fā)時(shí)機(jī)

  • Gen0已滿(最常見)
  • 系統(tǒng)物理內(nèi)存不足
  • 程序主動(dòng)調(diào)用GC.Collect()(不推薦)
  • AppDomain卸載或程序關(guān)閉

C# 的 GC 通過(guò)分代回收標(biāo)記 - 壓縮算法,自動(dòng)管理內(nèi)存,提高開發(fā)效率。理解其原理有助于寫出更高效的代碼,減少 GC 觸發(fā)頻率和 STW(Stop-The-World) 時(shí)間。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

娄烦县| 津市市| 泌阳县| 乳源| 铁岭县| 青河县| 噶尔县| 招远市| 墨竹工卡县| 南安市| 康马县| 大丰市| 耒阳市| 伊通| 江北区| 高平市| 宁都县| 玉屏| 田东县| 耿马| 十堰市| 安龙县| 平乐县| 阜康市| 临桂县| 平阴县| 龙岩市| 河南省| 治县。| 开平市| 沙洋县| 岢岚县| 江孜县| 无锡市| 陵水| 重庆市| 梓潼县| 闸北区| 仁布县| 余姚市| 惠安县|