CLR的垃圾回收器可以幫助我們回收資源,使得我們開發(fā)的時候不需要考慮對象回收,但是我們真的不用考慮了嗎?
垃圾回收器明確說明其只會回收:
“不再使用的對象”
一、對內(nèi)存泄漏的理解
我認(rèn)為判斷內(nèi)存是否泄漏取決于你知不知情:
- 如果你清晰的知道對象引用關(guān)系,那么就不算內(nèi)存泄漏,例如撤銷重做棧(里面保存了大量的歷史數(shù)據(jù))。
- 如果你認(rèn)為沒有對象在引用這個對象了,而GC.Collect()執(zhí)行后并沒有回收這個對象,那么這就是內(nèi)存泄漏。
導(dǎo)致內(nèi)存泄漏的根本原因就是:
你以為對象已經(jīng)用完了,但是仍有對象持有對它的引用
解決內(nèi)存泄漏的根本措施就是:
當(dāng)你的對象不需要的時候,不要讓還活著的對象引用你
二、內(nèi)存泄漏案例分析
下面我會列舉我們開發(fā)過程中遇到的多種 “你認(rèn)為沒有人引用那個對象了” 的場景,場景會持續(xù)更新。
三、內(nèi)存泄漏分析工具
分析內(nèi)存泄漏的來龍去脈,不是一款工具就可以全部解決的,建議使用下面多個工具結(jié)合使用,可查源碼,可調(diào)源碼,可看堆棧,可看變量,非常的方便。使用教程請移步Google。
![內(nèi)存泄漏分析工具.png]

image.png
- dnSpy:附加進程調(diào)試神器,可以直接調(diào)試源碼,不需要vs。
- windbg:調(diào)試神器,方便的看托管堆的各種數(shù)據(jù),牛刀。
- dotPeek:查看托管Dll的源碼,查看WPF的源碼必備。
- dotMemory:方便的對兩個快照之間產(chǎn)生的對象進行跟蹤,查看引用關(guān)系,方便的定位到內(nèi)存泄漏現(xiàn)象。
以上工具結(jié)合使用,足矣讓你掌握導(dǎo)致內(nèi)存泄漏的最深層次的原因。