查看单个应用程序最大内存限制

adb shell getprop|grep heapgrowthlimit
|[dalvik.vm.heapgrowthlimit]: [96m]

对于内存的限制 这里纠正一下:是 dalvik heap不能超过最大限制,跟Native heap没有关系!

这个96M是单个程序限制最大内存,而meminfo 里面的dalvik heap size 的最大值若果超出了96m 那就很可能会发生OOM

dalvik.vm.heapgrowthlimit和dalvik.vm.heapsize都是java虚拟机的最大内存限制,应用如果不想在dalvik heap达到heapgrowthlimit限制的时候出现OOM,需要在Manifest中的application标签中声明android:largeHeap=“true”,声明后应用dalvik heap 达到heapsize的时候才会出现OOM!

最大限制查看:

应用启动后分配的初始内存

adb shell getprop|grep dalvik.vm.heapstartsize
|[dalvik.vm.heapstartsize]: [8m]

单个java虚拟机最大的内存限制

adb shell getprop|grep dalvik.vm.heapsize
|[dalvik.vm.heapsize]: [384m]

关于内存

VSS – Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)

RSS – Resident Set Size 实际使用物理内存(包含共享库占用的内存)

PSS – Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)

USS – Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存) USS 是针对某个进程开始有可疑内存泄露的情况, 是一个程序启动了会产生的虚拟内存,一旦这个程序进程杀掉就会释放!

没错。不过USS需要通过root的手机。一般没有root的手机我们可以获取PSS。而PSS的话可以通过如下命令来获取

一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

adb shell dumpsys meminfo |grep TOTAL
```

Monitor工具

1.打开Device Monitor。

从/tools/路径下加载monitor工具。

2.在Debug Monitor窗口,从左边的进程列表中选择要查看的应用进程。

3.点击进程列表上面的Update Heap。

4.在右侧面板中选择Heap标签页。

Heap视图显示了堆内存使用的基本状况,每次垃圾回收后会更新。要看更新后的状态,点击Gause GC按钮。

Paste_Image.png

图1.Device Monitor工具显示[1] Update Heap和 [2] Cause GC按钮。右边的Heap标签页显示堆的情况。

有个app项目,每次都无缘无故闪退。然后我用monitor工具发现,byte array这里不停的增长,经常达到了20M 以上,最后找到原因是图片的问题