一、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
夜雨聆风