當一個對象的被引用數爲0時,就會被JVM的GC回收。對象有不一樣的引用級別,從最強到最弱,不一樣的引用(可到達性)級別反映了對象的生命週期。java
Java對象的泄漏,可分爲暫時不釋放,長期不釋放,沒法釋放幾種。緩存
上層Java不少功能須要依賴於系統底層的c庫來提供,設計不夠好的jni接口在正常使用時可能沒有什麼問題,可是不少時候,在稍微不注意的狀況下,就算上層的java對象釋放了,若是沒有顯式的調用jni的釋放接口,也會致使底層c庫中的泄漏問題。app
一些Android程序可能引用咱們的Android程序的對象(好比註冊機制)。即便咱們的Android程序已經結束了,可是別的引用程序仍然還有對咱們的Android程序的某個對象的引用,泄漏的內存依然不能被垃圾回收。常見的有:設計
BraodcastReceiver,ContentObserver,FileObserver。 server
對於上述兩種常見的內存泄漏,咱們在開發中須要記住如下2點: 對象
1. 對activity的持久引用,對activity的引用應該和activity自己有相同的生命週期,儘可能使用application代替activity做爲Context來獲取資源,或者構造Dialog或Toast。 接口
2. 若是不能控制非靜態的內部類的生命週期,儘可能在activity中避免有非靜態的內部類。同時在activity中使用靜態的類時若是須要引用activity,應該採用WeakReference弱引用來引用Activity。生命週期
好比PowerManager.WakeLock,MemoryFile等不少os對象。內存