一、查看内存大小
查看单个应用程序最大内存限制的方式:
1.内存数据文件地址: android手机内部 system/build.prop
adb pull system/build.prop 本地路径
打开该文件,查看对应的内存信息
2.另一种查看方式,使用命令行
adb shell getprop | grep heapgrowthlimit
得到对应的结果
[dalvik.vm.heapgrowthlimit]: [128m]
PS:当然adb shell getprop 还有可以得到其他。build.prop文件中包含的数据应该都可以获取,还没有具体去使用。
二、查看内存的方式
adb shell dumpsys meminfo <package-name>
结果如下:
看到这个图,其实都不陌生了,但是具体该看什么呢?先简单分析下:
1.dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的。
2.native是被native堆使用的内存。应该指使用C\C++在堆上分配的内存。
所以我们查看的大小是 dalvik heap(单位为KB,注意换算)不能超过最大限制(heapgrowthlimit)
另外一些参数含义:
Naitve Heap Size: 从mallinfo usmblks获得,代表最大总共分配空间
Native Heap Alloc: 从mallinfo uorblks获得,总共分配空间
Native Heap Free: 从mallinfo fordblks获得,代表总共剩余空间
Native Heap Size 约等于Native Heap Alloc + Native Heap Free
mallinfo是一个C库, mallinfo 函数提供了各种各样的通过C的malloc()函数分配的内存的统计信息。
Dalvik Heap Size:从Runtime totalMemory()获得,Dalvik Heap总共的内存大小。
Dalvik Heap Alloc: Runtime totalMemory()-freeMemory() ,Dalvik Heap分配的内存大小。
Dalvik Heap Free:从Runtime freeMemory()获得,Dalvik Heap剩余的内存大小。
Dalvik Heap Size 约等于Dalvik HeapAlloc + Dalvik Heap Free
我们关注主要就是 native和dalvik的heap size,通过自动化或手工测试,查看heap size 是否处于一直增长的状态,若一直增长,可能会出现oom的情况。
结果分析: 可以查看 https://developer.android.com/reference/android/os/Debug.MemoryInfo.html 具体字段意义
linux系统或者Android 系统内存大多是共享的,所以单独计算使用的内存是特别困难。
1.pss:proportional set size Pss数字是内核计算的衡量内存共享的度量标准,基本上每个页面的RAM都是通过使用该页面的其他进程的数量进行缩放。这样,您可以(理论上)将所有进程中的pss加起来,以查看它们正在使用的总RAM,并比较进程之间的pss,以了解它们的相对权重。
2.private Dirty:另一个有趣的指标是PrivateDirty,它基本上是不能被分页到磁盘的进程内的RAM量(它不受磁盘上相同的数据支持),并且不与任何其他进程共享。另一种看待这种情况的方法是当该过程消失时(可能很快将其纳入高速缓存和其他用途),RAM将可用于系统。
3.private Clean: 未找到合适的说明,猜测就属于未使用的私有的磁盘大小
4.Swapped Dirty:未找到合适的说明,猜测交换的磁盘控件的大小
三、Memory Monitor
前提:一定是debug 的包,release的包无法查看
可参考该文章进行内存泄漏操作查看
http://www.cnblogs.com/linguanh/p/5601232.html
具体可查看https://developer.android.com/studio/profile/am-hprof.html?#hprof-snapshot
https://developer.android.com/studio/profile/am-allocation.html,英文水平不佳,准备开始翻译