我對內(nèi)存泄漏的理解

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ù)更新。

  1. DispatcherTimer
  2. Data Binding
  3. Event Handler
  4. Static Event

三、內(nèi)存泄漏分析工具

分析內(nèi)存泄漏的來龍去脈,不是一款工具就可以全部解決的,建議使用下面多個工具結(jié)合使用,可查源碼,可調(diào)源碼,可看堆棧,可看變量,非常的方便。使用教程請移步Google。
![內(nèi)存泄漏分析工具.png]

image.png

  1. dnSpy:附加進程調(diào)試神器,可以直接調(diào)試源碼,不需要vs。
  2. windbg:調(diào)試神器,方便的看托管堆的各種數(shù)據(jù),牛刀。
  3. dotPeek:查看托管Dll的源碼,查看WPF的源碼必備。
  4. dotMemory:方便的對兩個快照之間產(chǎn)生的對象進行跟蹤,查看引用關(guān)系,方便的定位到內(nèi)存泄漏現(xiàn)象。

以上工具結(jié)合使用,足矣讓你掌握導(dǎo)致內(nèi)存泄漏的最深層次的原因。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容