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