概念
- 內(nèi)存泄露:Android 為每個(gè)應(yīng)用分配了一定大小的內(nèi)存,JVM會(huì)定時(shí)的回收它認(rèn)為沒(méi)有用的內(nèi)存,當(dāng)代碼不規(guī)范時(shí)會(huì)導(dǎo)致一些內(nèi)存無(wú)法被回收占用沒(méi)存資源,當(dāng)內(nèi)存資源不足時(shí)一些內(nèi)存也無(wú)法被回收,JVM就會(huì)拋出內(nèi)存泄漏異常
- 內(nèi)存溢出:Android 為每個(gè)應(yīng)用分配了一定大小的內(nèi)存,當(dāng)Android應(yīng)用new出一個(gè)對(duì)象時(shí)會(huì)向系統(tǒng)申請(qǐng)內(nèi)存,這時(shí)如果系統(tǒng)分配給應(yīng)用的內(nèi)存不足(內(nèi)存泄露導(dǎo)致內(nèi)存無(wú)法釋放一直占用內(nèi)存資源)就會(huì)拋出內(nèi)存溢出異常
引用模式
- 強(qiáng)引用:對(duì)象只要有引用就不會(huì)被回收
Object obj = new Object()
- 軟引用:當(dāng)系統(tǒng)發(fā)現(xiàn)快要發(fā)生內(nèi)存溢出時(shí),會(huì)回收該類(lèi)的對(duì)象。
可以配合引用隊(duì)列ReferenceQueue聯(lián)合使用,如果軟引用所引用的對(duì)象被回收掉JVM會(huì)把該軟引用存放到已關(guān)聯(lián)的ReferenceQueue中,等到系統(tǒng)將要拋出OutOfMemoryError的時(shí)候就會(huì)去回收ReferenceQueue中的軟引用(ReferenceQueue回收機(jī)制是優(yōu)先回收不常用的)
new Handler(new SoftReference<>(activity))
- 弱引用:jvm會(huì)不定時(shí)gc,在下一次GC時(shí)會(huì)被回收
new Handler(new WeakReference<>(activity))
- 虛引用:引用關(guān)系最弱的
new Handler(new PhantomReference<>(activity))