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