Android-内存

2017-01-01 10:46

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

 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 <Package Name>|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标签页显示堆的情况。

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

参考

原文https://testerhome.com/topics/2572