在分析Android內(nèi)存泄漏之前,先了解一下JAVA的一些知識
1. JAVA中的對象的創(chuàng)建
使用new指令生成對象時,堆內(nèi)存將會為此開辟一份空間存放該對象
垃圾回收器回收非存活的對象,并釋放對應(yīng)的內(nèi)存空間
2.Java如何判定對象存活或死亡?
可達(dá)性分析算法
1給對象中添加一個引用計數(shù),假如為count
2當(dāng)引用這個對象時:count++
3當(dāng)count==0時:對象處于,也就是說沒有其它地方在引用這個對象了,對象就處于“死亡”狀態(tài),回收對象可達(dá)性分析算法
舉個例子:像找人一樣,A認(rèn)識B,B認(rèn)識C,C認(rèn)識D,那么A就要吧通過這樣的關(guān)系認(rèn)識D,如果能找到D,說明D對象是存活的,不能回收,如果通過所有的關(guān)系都找不到D,說明D是“死亡”的,回收D對象。
可達(dá)性分析算法的定義:通過一系列的稱為 GC
Roots 的對象作為起點,從這些節(jié)點開始向下搜索,搜索把走過的路徑稱為引用鏈,當(dāng)一個對象到 GC Roots 沒有任何引用鏈相連(就是從GC Roots 到這個對象不可達(dá))時,則證明此對象是不可用的。如下圖,Object5,Object6,Object7就是不可達(dá)對象,是要被回收的對象
問:哪些對象可以作為GC Roots對象呢?
1虛擬機(jī)棧中引用的對象
2方法區(qū)中類靜態(tài)屬性引用的對象
3方法區(qū)中常量引用的對象
4本地方法棧中JNI引用的對象