非靜態內部類導致內存泄漏主要原因:::App可能會因為大量的內存泄漏導致內存耗盡,引發Crash,如果內存耗盡,App會由於內存空間不足,出現頻繁的GC,每一次GC都是一個耗時阻塞操作,會造成設備卡頓。
非靜態內部類中創建了一個靜態實例,導致該實例的生命周期和應用ClassLoader級別,又因為該靜態實例會隱式持有其外部類的引用,所以導致其外部類無法正常釋放,出現泄漏問題。
(classloader:用來動態加載某個class文件到內存當中,只有class被載入到內存中之后,才能被其他class所引用)
1.非靜態內部類會對外部類存在一個隱式引用 非靜態(匿名)內部類會持有外部類的引用,靜態內部類中未持有外部類的引用。
2.非靜態內部類中存在異步任務,可能導致其對應的外部類內存資源無法正常釋放
3.非靜態內部類中創建了一個靜態實例,會導致內存泄漏
解決思路::::去掉隱式引用(靜態(匿名)內部類),手動管理對象引用(修改靜態內部類的構造方法,手動引入其外部類引用)當內存不可用時,不執行不可控代碼(Android 可以結合智能指針 ,WeakReference包裹外部類實例)
總結::::不是所有內部類只能使用靜態內部類,只有在該內部類中的生命周期不可控的情況下,采用靜態內部類。
多想想對象之間的引用關系。