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