CLR的垃圾回收器可以幫助我們回收資源店量,使得我們開發(fā)的時(shí)候不需要考慮對(duì)象回收芜果,但是我們真的不用考慮了嗎?
垃圾回收器明確說明其只會(huì)回收:
“不再使用的對(duì)象”
一融师、對(duì)內(nèi)存泄漏的理解
我認(rèn)為判斷內(nèi)存是否泄漏取決于你知不知情:
- 如果你清晰的知道對(duì)象引用關(guān)系右钾,那么就不算內(nèi)存泄漏,例如撤銷重做棧(里面保存了大量的歷史數(shù)據(jù))旱爆。
- 如果你認(rèn)為沒有對(duì)象在引用這個(gè)對(duì)象了舀射,而GC.Collect()執(zhí)行后并沒有回收這個(gè)對(duì)象,那么這就是內(nèi)存泄漏怀伦。
導(dǎo)致內(nèi)存泄漏的根本原因就是:
你以為對(duì)象已經(jīng)用完了脆烟,但是仍有對(duì)象持有對(duì)它的引用
解決內(nèi)存泄漏的根本措施就是:
當(dāng)你的對(duì)象不需要的時(shí)候,不要讓還活著的對(duì)象引用你
二房待、內(nèi)存泄漏案例分析
下面我會(huì)列舉我們開發(fā)過程中遇到的多種 “你認(rèn)為沒有人引用那個(gè)對(duì)象了” 的場(chǎng)景邢羔,場(chǎng)景會(huì)持續(xù)更新。
三桑孩、內(nèi)存泄漏分析工具
分析內(nèi)存泄漏的來龍去脈张抄,不是一款工具就可以全部解決的,建議使用下面多個(gè)工具結(jié)合使用洼怔,可查源碼,可調(diào)源碼左驾,可看堆棧镣隶,可看變量,非常的方便诡右。使用教程請(qǐng)移步Google安岂。
![內(nèi)存泄漏分析工具.png]
- dnSpy:附加進(jìn)程調(diào)試神器,可以直接調(diào)試源碼帆吻,不需要vs域那。
- windbg:調(diào)試神器,方便的看托管堆的各種數(shù)據(jù)猜煮,牛刀次员。
- dotPeek:查看托管Dll的源碼,查看WPF的源碼必備王带。
- dotMemory:方便的對(duì)兩個(gè)快照之間產(chǎn)生的對(duì)象進(jìn)行跟蹤淑蔚,查看引用關(guān)系,方便的定位到內(nèi)存泄漏現(xiàn)象愕撰。
以上工具結(jié)合使用刹衫,足矣讓你掌握導(dǎo)致內(nèi)存泄漏的最深層次的原因醋寝。