乐于分享
好东西不私藏

Android App内存限制 & OOM

Android App内存限制 & OOM

一、dumpsys获取内存数据

1):查看所有应用的内存消耗情况

adb shell dumpsys meminfo

2)想查看某一应用或某一个进程的详细的内存信息

adb shell dumpsys meminfo packagename or pid

图片来源网络:

从上面的Heap size类别中包含Native Heap和Dalvik Heap两部分Heap,其中dalvik就是平时说的java堆,我们创建的对象都在这里分配的。

其中,dalvik heap不能超过最大限制,超过最大限制就会出现OOM;

备注:

1)单个应用常规最大堆限制:

adb shell getprop | grep dalvik.vm.heapgrowthlimit

简写:heapgrowthlimit,普通模式上限

2) App 启动初始分配内存

adb shell getprop | grep dalvik.vm.heapstartsize

简写:heapstartsize,起步内存

3)开启大堆后的极限内存

adb shell getprop | grep dalvik.vm.heapsize

简写:heapsize,largeHeap 模式上限

二、两个堆区分

Dalvik Heap:Java/Kotlin 对象占用,受虚拟机内存限制,超上限直接 OOM

Native Heap:C/C++ 代码申请内存,不受上面三个参数管控

三、largeHeap 作用(避免提前 OOM)

应用如果不想在dalvik heap达到heapgrowthlimit限制的时候出现OOM,需要在Manifest中的application标签中声明android:largeHeap=“true”,声明后,如果应用的dalvik heap 达到heapsize的时候才会出现OOM!

四、OOM 关键结论

1)OOM ≠ 整机内存不足,单纯是 Java 堆内存超过虚拟机阈值,机身剩余 RAM 再多也会崩溃;

2)不同厂商、系统版本,heapgrowthlimit/heapsize 配置数值可能不一样(常见 16M/24M/48M/128M 等)

五、快速判断 OOM 思路

看 meminfo 里 Dalvik Heap 最大值:

未开 largeHeap:超过 heapgrowthlimit → OOM

开了 largeHeap:超过 heapsize → OOM