內(nèi)存泄漏解析

常識

  1. 非靜態(tài)內(nèi)部類(包括匿名內(nèi)部類:)默認會持有外部類的引用
  2. 靜態(tài)內(nèi)部類不會持有外部類的引用
  3. 靜態(tài)存儲區(qū)(存儲靜態(tài)數(shù)據(jù),全局的static數(shù)據(jù)),在程序運行中,它都存在

情況一:
在單例模式中,使用的是靜態(tài)的對象,所以該對象不能引用生命周期比他短的實例(比如activity的context),要保證他持有的對象跟他自己的生命周期一樣長

情況二:使用非靜態(tài)內(nèi)部類創(chuàng)建靜態(tài)實例
非靜態(tài)內(nèi)部類會持有外部類的對象,而再用此非靜態(tài)內(nèi)部類去創(chuàng)建了靜態(tài)的對象,靜態(tài)對象生命周期跟app的生命周期一樣長,這就導致外部類釋放不掉

實例

  1. handle使用:handle是一個匿名內(nèi)部類,所以使用它時默認會持有外部類的對象(activity),當外部引用(如activity)提前銷毀時,但是handle還沒有處理完全部消息時,就會造成內(nèi)存泄漏。所以一般都將handle設為靜態(tài)內(nèi)部類,這樣就不會引用外部類,但是如果需要使用外部類的對象時,可以將其設為軟引用,方便gc回收

  2. asynTask和runnable : 都屬于匿名內(nèi)部類,如果外部的引用提前銷毀了(如activity),但是asyntask的任務還沒有執(zhí)行完,則會造成內(nèi)存泄漏。所以默認都設置為靜態(tài)內(nèi)部類,要使用外部對象時,將其設置為軟引用,方便gc回收

3.資源未釋放造成的內(nèi)存泄漏,如注冊與取消注冊問題,bitmap的回收等等。

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

相關閱讀更多精彩內(nèi)容

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