android其實很簡單--記憶體相關
阿新 • • 發佈:2019-02-10
記憶體洩漏
java是垃圾回收語言,無需開發者管理記憶體分配
邏輯上的失誤導致記憶體洩漏:當應用不再需要這個物件的時候仍未釋放該物件的所有應用
1.Context,由於Content包含了大量的記憶體引用。
全域性的process的static引用activity
2.static view
2.靜態inner classes
內部類持有外部類的強引用
3.匿名類
當acitivity被銷燬的時候,匿名的AsyncTask會持有activity的強引用直到asynctask結束
避免在Activity中使用非靜態內部類,如果該類的例項會存在在Activity的生命週期之外
4.Handler
與匿名類類似,當message沒處理完時,handler不會被釋放
5.Threads
thread沒執行結束時,也會持有activity
6.TimerTask
只要是匿名類的例項,不管是不是在工作執行緒,都會持有Activity的引用,導致記憶體洩漏。
靜態內部類代替匿名類,使用弱引用訪問外部類
7.Sensor Manager listener
沒有登出監聽器,也會導致記憶體洩漏
GC
沒有GCRoot的物件將被回收
1.強引用
- 當其指示的物件沒有任何強引用物件指向它;
2.軟引用
- 當其指示的物件沒有任何強引用物件指向它;
- 當虛擬機器記憶體不足時。
3.弱引用
WeakReference不改變原有強引用物件的垃圾回收時機,一旦其指示物件沒有任何強引用物件時,此物件即進入正常的垃圾回收流程。
- 虛引用
方法
LeakCanary