Android内存分析

来源:互联网 发布:mac acl是什么意思 编辑:程序博客网 时间:2024/05/28 23:22

最近简单学些了android内存分析,下面为一些学习笔记和整理。

 

一、内存数据的获取

1. 查看手机系统内存信息

adb pull /system/build.prop

打开build.prop可以查看堆分配的一些信息:

build_prop

 

2. VSS RSS USS PSS获取

首先理解一下它们的含义:

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

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

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

USS – Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

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

 

下面介绍各项的获取方法:

1)VSS和RSS

adb shell top命令,获取到的信息列分别为:

PID(进程ID)  CPU%(CPU占用率) #THR(程序线程数)   VSS     RSS   UID(用户ID)      Name(程序名)

 

2)PSS

adb shell dumpsys meminfo [package-name]

meminfo

 

3)USS

USS的获取必须要通过procrank。首先到网上下载libpagemap.so, procmem, procrank这几个文件(下载地址在网上找了好久,先卖个关子~~),然后push到android手机中。有的root机自带这几个文件,不需要额外下载。

adb push procrank /system/xbinadb push procmem /system/xbinadb push libpagemap.so /system/lib

然后赋予赋权:

adb shell chmod 6755 /system/xbin/procrankadb shell chmod 6755 /system/xbin/procmemadb shell chmod 6755 /system/lib/libpagemap.so

后面就可以用adb shell procrank命令了,该命令可以查看PID VSS RSS PSS USS所有数据。

 

二、内存分析

内存分析的工具有android studio、 DDMS monitor。随着android studio版本的演进,功能也集成得越来越多,建议大家使用最新的android studio。

 

1. 查看内存占用趋势图

memory1_meitu_4

可以看到内存随着时间变化趋势。

 

2. dump java heap

点击dump java heap,即会自动打开一个hprof文件,即为当前的java heap分配snapshot,可以按size排序。展示方式有class list view 和 package tree view。选择一个class,右侧instance中会列出所有instance变量,选择一个instance,下方reference tree即展现该instance的引用过程。右击即可直接跳到源码。

memory2

上图中所有量的含义如下:

左侧class panel中:

  • Total Count 内存中该类的对象个数;
  • Heap Count 堆内存中该类的对象个数;
  • Sizeof 物理大小;
  • Shallow size 该对象本身占有内存大小;
  • Retained Size 释放该对象后,节省的内存大小;

右侧instance panel中:

  • depth 深度;
  • Shallow Size 对象本身内存大小;
  • Dominating Size 管辖的内存大小;

 

3. 内存分配跟踪 allocation tracking

第一次点击allocation tacking,即start allocation tracking,在手机上操作之后,再点击一次即stop allocation tracking,然后会自动打开一个内存跟踪alloc文件。可以group by Method或者allocator,Size就是内存大小,Count就是分配了多少次内存,可以一步步迭代到最底部。同样的右击可以定位到源码。

memory3

点击group by allocator右边的彩色图标,可以查看统计信息。随着鼠标的移动,右侧的信息实时展示,并且可以点击分析局部。

memory4

 

另外android monitor中同样可以跟踪内存分配情况,作用基本上和android studio中使用一致,但是展示方式不一样。android studio -> tools -> android -> android device monitor,即可打开monitor。

选择待测试手机和进程,点击start tracking,手机上执行操作,点击get allocations. 同样的可以看到内存分配大小、分配对象、以及具体的分配顺序。

memory5

 

三、内存泄漏、内存溢出

另外,顺便说一下内存泄漏和内存溢出。

内存溢出就是应用的内存超过阈值了,主要原因有:

  1. 瞬间申请过大内存;
  2. 应用代码存在内存泄露,内存长时间积累无法释放;
  3. 应用的某些逻辑操作疯狂的消耗掉大量内存;

内存溢出的判断直接看实时日志OutOfMemoryError,但是具体分析需要通过allocation tracking追踪之前的内存分配情况。

 

内存泄漏即当对象本该被回收的时候还被其他对象所持有引用,导致应用长时间运行之后,所占用的内存越来越大,app卡顿或者crash。

内存泄漏的分析可以借助1)dump java heap + memory analysis tool (MAT) ;2)leakcanary;3)android studio最新版本也集成了内存泄漏检测,可以尝试一下。

 

参考网址:

http://blog.csdn.net/yanbober/article/details/48394201

http://developer.android.com/intl/ko/tools/debugging/debugging-memory.html

http://blog.csdn.net/itfootball


原文地址: http://www.dzwanli.com.cn/?p=1464

0 0
原创粉丝点击