1. 程式人生 > >android其實很簡單--記憶體相關

android其實很簡單--記憶體相關

記憶體洩漏

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不改變原有強引用物件的垃圾回收時機,一旦其指示物件沒有任何強引用物件時,此物件即進入正常的垃圾回收流程。

    1. 虛引用

方法

LeakCanary

參考