OOM

概念

  1. 內(nèi)存溢出 - VM在分配內(nèi)存時內(nèi)存不足導致內(nèi)存溢出
  2. 內(nèi)存泄漏 - 有對象在釋放時沒有完全的清除引用導致內(nèi)存泄漏,內(nèi)存泄漏可能導致內(nèi)存溢出
  3. GC - Java內(nèi)部的回收器會定時的清除沒有被引用的對象
  4. OOM - 內(nèi)存溢出時虛擬機會拋出Out of memory的異常

OOM的過程

  1. app啟動的時候會分配一個內(nèi)存 initSize
  2. 當程序運行中內(nèi)存不足時會增加內(nèi)存
  3. GC回收未被引用或弱引用虛引用的對象
  4. 當出現(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的原因

  1. 加載對象過大
  2. 相應資源過多,來不及釋放

如何解決

  1. 在內(nèi)存引用上做些處理,常用的有軟引用、強化引用、弱引用
  2. 在內(nèi)存中加載圖片時直接在內(nèi)存中作處理,如邊界壓縮
  3. 動態(tài)回收內(nèi)存
  4. 優(yōu)化Dalvik虛擬機的堆內(nèi)存分配
  5. 自定義堆內(nèi)存大小
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容