前言
如果在內(nèi)存泄漏發(fā)生后再去找原因并修復(fù)會(huì)增加開(kāi)發(fā)的成本被冒,最好在編寫(xiě)代碼時(shí)就能夠很好地考慮內(nèi)存問(wèn)題,寫(xiě)出更高質(zhì)量的代碼杂腰,這里列出一些常見(jiàn)的內(nèi)存泄漏場(chǎng)景森渐,在以后的開(kāi)發(fā)過(guò)程中需要避免這類問(wèn)題类腮。
場(chǎng)景
資源性對(duì)象未關(guān)閉臊泰。比如Cursor、File文件等蚜枢,往往都用了一些緩沖缸逃,在不使用時(shí),應(yīng)該及時(shí)關(guān)閉它們厂抽。
注冊(cè)對(duì)象未注銷需频。比如事件注冊(cè)后未注銷,會(huì)導(dǎo)致觀察者列表中維持著對(duì)象的引用修肠。
類的靜態(tài)變量持有大數(shù)據(jù)對(duì)象。
非靜態(tài)內(nèi)部類的靜態(tài)實(shí)例户盯。
Handler臨時(shí)性內(nèi)存泄漏嵌施。如果Handler是非靜態(tài)的饲化,容易導(dǎo)致Activity或Service不會(huì)被回收。
容器中的對(duì)象沒(méi)清理造成的內(nèi)存泄漏吗伤。
WebView吃靠。WebView存在著內(nèi)存泄漏的問(wèn)題,在應(yīng)用中只要使用一次WebView足淆,內(nèi)存就不會(huì)被釋放掉巢块。
監(jiān)控
除此之外,內(nèi)存泄漏可監(jiān)控巧号,常見(jiàn)的就是用LeakCanary第三方庫(kù)族奢,這是一個(gè)檢測(cè)內(nèi)存泄漏的開(kāi)源庫(kù),使用非常簡(jiǎn)單丹鸿,可以在發(fā)生內(nèi)存泄漏時(shí)告警越走,并且生成leak tarce分析泄漏位置,同時(shí)可以提供Dump文件進(jìn)行分析靠欢。