mb612e2e66047a8 2021-09-18 06:42:38 阅读数:949
靜態變量
示例:
這裏 Police 持有 activity 的引用,會造成 activity 得不到釋放,導致內存泄漏。
解决方法:
參考 第二點 Handler 的處理方式
示例:
很多初學者都會像上面這樣新建線程和异步任務,殊不知這樣的寫法非常地不友好,這種方式新建的子線程Thread
和AsyncTask
都是匿名內部類對象,默認就隱式的持有外部Activity
的引用,導致Activity
內存泄露。
解决方法:
示例:
在注册觀察則模式的時候,如果不及時取消也會造成內存泄露。比如使用Retrofit + RxJava
注册網絡請求的觀察者回調,同樣作為匿名內部類持有外部引用,所以需要記得在不用或者銷毀的時候取消注册。
解决方法:
示例:
當我們Activity
銷毀的時,有可能Timer
還在繼續等待執行TimerTask
,它持有Activity 的引用不能被 GC 回收,因此當我們 Activity 銷毀的時候要立即cancel
掉Timer
和TimerTask
,以避免發生內存泄漏。
解决方法:
示例:
解决方法:
屬性動畫
示例:
動畫同樣是一個耗時任務,比如在 Activity 中啟動了屬性動畫 (ObjectAnimator) ,但是在銷毀的時候,沒有調用 cancle 方法,雖然我們看不到動畫了,但是這個動畫依然會不斷地播放下去,動畫引用所在的控件,所在的控件引用 Activity ,這就造成 Activity 無法正常釋放。因此同樣要在Activity 銷毀的時候 cancel 掉屬性動畫,避免發生內存泄漏。
解决方法:
示例:
如果在開發調試中遇見 Android 源碼或者 第三方 SDK 持有了我們當前的 Activity 或者其它類,那麼現在怎麼辦了。
解决方法:
當前是通過 Java 中的反射找到某個類或者成員,來進行手動 = null 的操作。
內存頻繁的分配與回收,(分配速度大於回收速度時) 最終產生 OOM 。
也許下面的錄屏更能解釋什麼是內存抖動
可以看出當我點擊了一下 Button 內存就頻繁的創建並回收(注意看垃圾桶)。
那麼我們找出代碼中具體那一塊出現問題了勒,請看下面一段錄屏
最後我們之後是 onClick 中的 imPrettySureSortingIsFree() 函數裏面的 rowAsStr += sorted[j]; 字符串拼接造成的 內存抖動 ,因為每次拼接一個 String 都會申請一塊新的堆內存,那麼怎麼解决這個頻繁開辟內存的問題了。
其實在 Java 中有 2 個更好的 API 對 String 的操作很友好,相信應該有人猜到了吧。沒錯就是將 此處的 String 換成 StringBuffer 或者 StringBuilder,就能很完美的解决字符串拼接造成的內存抖動問題。
修改後
只要養成這樣的習慣,至少可以避免 90 % 以上不會造成內存异常
**1. 數據類型: **不要使用比需求更占用空間的基本數據類型
2. 循環盡量用 foreach ,少用 iterator, 自動裝箱也盡量少用
3. 數據結構與算法的解度處理 (數組,鏈錶,棧樹,樹,圖)
數據量千級以內可以使用 Sparse 數組 (Key為整數),ArrayMap (Key 為對象) 雖然性能不如 HashMap ,但節約內存。
4. 枚舉優化
缺點:
每一個枚舉值都是一個單例對象,在使用它時會增加額外的內存消耗,所以枚舉相比與 Integer 和 String 會占用更多的內存
較多的使用 Enum 會增加 DEX 文件的大小,會造成運行時更多的 IO 開銷,使我們的應用需要更多的空間
特別是分 Dex 多的大型 APP,枚舉的初始化很容易導致 ANR
優化後的代碼:可以直接限定傳入的參數個數
5. static , static final 的問題
基本數據類型的成員,可以全寫成 static final
6. 字符串的拼接盡量少用 +=
7. 重複申請內存問題
8. 避免 GC 回收將來要重新使用的對象 (內存設計模式對象池 + LRU 算法)
9. Activity 組件泄漏
10. Service 耗時操作盡量使用 IntentService,而不是 Service
如果你覺得文章寫得不錯就給個贊唄?如果你覺得那裏值得改進的,請給我留言。一定會認真查詢,修正不足。謝謝。
希望讀到這的您能轉發分享和關注一下我,以後還會更新技術幹貨,謝謝您的支持!
轉發+點贊+關注,第一時間獲取最新知識點
改變人生,沒有什麼捷徑可言,這條路需要自己親自去走一走,只有深入思考,不斷反思總結,保持學習的熱情,一步一步構建自己完整的知識體系,才是最終的制勝之道,也是程序員應該承擔的使命。
CodeChina開源項目:《Android學習筆記總結+移動架構視頻+大廠面試真題+項目實戰源碼》
《系列學習視頻》
《系列學習文檔》
《我的大廠面試之旅》
版权声明:本文为[mb612e2e66047a8]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210918064237810j.html