Android内存分析
来源:互联网 发布:mac acl是什么意思 编辑:程序博客网 时间:2024/05/28 23:22
最近简单学些了android内存分析,下面为一些学习笔记和整理。
一、内存数据的获取
1. 查看手机系统内存信息
adb pull /system/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]
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. 查看内存占用趋势图
可以看到内存随着时间变化趋势。
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的引用过程。右击即可直接跳到源码。
上图中所有量的含义如下:
左侧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就是分配了多少次内存,可以一步步迭代到最底部。同样的右击可以定位到源码。
点击group by allocator右边的彩色图标,可以查看统计信息。随着鼠标的移动,右侧的信息实时展示,并且可以点击分析局部。
另外android monitor中同样可以跟踪内存分配情况,作用基本上和android studio中使用一致,但是展示方式不一样。android studio -> tools -> android -> android device monitor,即可打开monitor。
选择待测试手机和进程,点击start tracking,手机上执行操作,点击get allocations. 同样的可以看到内存分配大小、分配对象、以及具体的分配顺序。
三、内存泄漏、内存溢出
另外,顺便说一下内存泄漏和内存溢出。
内存溢出就是应用的内存超过阈值了,主要原因有:
- 瞬间申请过大内存;
- 应用代码存在内存泄露,内存长时间积累无法释放;
- 应用的某些逻辑操作疯狂的消耗掉大量内存;
内存溢出的判断直接看实时日志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
- Android内存管理分析
- Android内存管理分析
- Android 内存分析工具
- Android内存泄露分析
- Android内存分析工具
- Android 内存指标分析
- Android 内存泄漏分析
- 【Android】内存分析
- Android Launcher 内存分析
- Android应用程序内存分析
- Android 内存分析工具
- android 内存分析
- android内存分析
- Android内存分析工具
- android 内存分析
- Android 内存分析工具
- Android 内存分析工具
- android 内存分析心得
- ICPCCamp2017 Day 5 I Coprime Queries(莫比乌斯函数 + 容斥定理 + 二分)
- RNN以及LSTM的介绍和公式梳理
- Python 猜数小游戏
- ContentResolve内容访问者(访问系统)
- C# 图片识别(支持21种语言)
- Android内存分析
- SAP S/4HANA 1610新版本有哪些新功能
- Linux Used内存到底哪里去了?
- 259. 3Sum Smaller
- 10001UVa伊甸园
- boost::less_than_comparable 使用
- 初级01 love2D环境搭建-超级懒人版
- Caffe使用step by step:caffe框架下的基本操作和分析
- Caffe 初识,揭开面纱