查看单个应用程序最大内存限制
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 以上,最后找到原因是图片的问题
参考