內存泄漏
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