概念
- 內(nèi)存溢出 - VM在分配內(nèi)存時(shí)內(nèi)存不足導(dǎo)致內(nèi)存溢出
- 內(nèi)存泄漏 - 有對(duì)象在釋放時(shí)沒(méi)有完全的清除引用導(dǎo)致內(nèi)存泄漏快骗,內(nèi)存泄漏可能導(dǎo)致內(nèi)存溢出
- GC - Java內(nèi)部的回收器會(huì)定時(shí)的清除沒(méi)有被引用的對(duì)象
- OOM - 內(nèi)存溢出時(shí)虛擬機(jī)會(huì)拋出Out of memory的異常
OOM的過(guò)程
- app啟動(dòng)的時(shí)候會(huì)分配一個(gè)內(nèi)存 initSize
- 當(dāng)程序運(yùn)行中內(nèi)存不足時(shí)會(huì)增加內(nèi)存
- GC回收未被引用或弱引用虛引用的對(duì)象
- 當(dāng)出現(xiàn)對(duì)象過(guò)多無(wú)法被GC呢撞, 需要的內(nèi)存空間大于heapSize時(shí),拋出OOM
ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
int heapSize = manager.getMemoryClass(); //最大內(nèi)存
int maxHeapSize = manager.getLargeMemoryClass(); //當(dāng)配置了android:largeHeap="true" 才有的最大堆內(nèi)存
Log.d(TAG, "heapSize" + heapSize + "maxHeapSize" + maxHeapSize);
出現(xiàn)OOM的原因
- 加載對(duì)象過(guò)大
- 相應(yīng)資源過(guò)多,來(lái)不及釋放
如何解決
- 在內(nèi)存引用上做些處理垮衷,常用的有軟引用、強(qiáng)化引用、弱引用
- 在內(nèi)存中加載圖片時(shí)直接在內(nèi)存中作處理佃却,如邊界壓縮
- 動(dòng)態(tài)回收內(nèi)存
- 優(yōu)化Dalvik虛擬機(jī)的堆內(nèi)存分配
- 自定義堆內(nèi)存大小