微信号:grzlwx

介绍:光荣之路官方资讯

Android内存监控与分析三部曲(三)

2017-11-04 11:00 马华平
Gloryroad
新书速递

吴老师的java版《selenium webdriver 实战宝典》和python版《selenium Webdriver 3.0 自动化测试框架实战指南》出版了,代码拿来就能用。

作者:马华平

 

阅读提示:

Android内存监控与分析三部曲(一)--最常遇见的内存泄漏测试场景

Android内存监控与分析三部曲(二)--Java内存管理机制

 

二、Android的内存管理

找到内存泄漏的原因后,我们需要进一步知道Android是如何管理APP内存的。

在APP启动时,为了能够使得Android应用程序安全且快速的运行,Android的每个应用程序都会使用一个专有的虚拟机(VM)实例来运行,它是由Zygote服务进程孵化出来的,也就是说每个应用程序都是在属于自己的独立进程中运行的(App heap)。Android为不同类型的进程分配了不同的内存使用上限(图3),如果程序在运行过程中出现了内存泄漏的而造成应用进程使用的内存超过了这个上限,则会被系统视为内存溢出,从而被kill掉,这使得仅仅APP自己的进程被kill掉(图4),而不会影响其他进程(如果是system_process等系统进程出问题的话,则会引起系统重启)。如图14:

图14 由Zygote服务进程孵化的APP进程

那么Android是怎么管理这些App的内存的呢, 这些独立运行的VM中的内存管理又是怎样的呢?

1. Android虚拟机类型:Dalvik & ART

A. Dalvik:Android 4.4及其以下平台使用的虚拟机

B. ART:Android 4.4以上平台使用的虚拟机

ART 取自 Android Run Time。 Android用其取代Dalvik,,主要目的就是为了提升运行性能。ART引入了AOT这种预编译技术提升移动设备的续航能力,在垃圾回收,在应用程序安装的过程中,ART就已经将所有的字节码重新编译成了机器码。应用程序运行过程中无需进行实时的编译工作,只需要进行直接调用。因此,ART极大的提高了应用程序的运行效率,同时也减少了手机的电量消耗,在垃圾回收等机制上也有了较大的提升。所以,ART相比Dalvik有了几个关键的提升。数据对比,如图15:

图15 虚拟机数据对比

 ART优点:

  • 系统性能的显著提升;

  • 应用启动更快、运行更快、体验更流畅、触感反馈更及时;

  • 更长的电池续航能力;

  • 支持更低的硬件。

ART缺点:

  • 更大的存储空间占用,可能会增加10% - 20%;

  • 更长的应用安装时间。

2. Android的内存管理方式

 ART和Dalvik都是使用paging和memory-mapping(mmapping)来管理内存的。这就意味着,任何被分配的内存都会持续存在,唯一释放这块内存的方式就是释放对象引用(让对象GC Root不可达),从而让GC来回收内存(参考前文关于Java垃圾回收机制)。

对于每个App进程来说, Heap内存被限制在一个虚拟的内存区间内。且定义了逻辑上的使用的Heap Size,这个Heap Size在系统限制的最大值之内(图3)随着应用的使用情况而变化(图2)。

Dalvik的Heap和Stack(图17)

图17 Dalvik的Heap和Stack

 了解生成的数据在哪里存储之后,才能更好的排除问题。

查看APP内存使用情况,命令adb shell dumpsys meminfo $package or $pid。如图18:

图18 内存信息(dumpsys meminfo package)

 其中,各个字段的含义如图19:

图19 dumpsys meminfo中各字段的含义

通过dumpsys meminfo获取的信息中,主要关注如下几个字段(图18)

(1)Native/Dalvik 的Heap 信息

具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。

(2)Total 的PSS信息

这个值就是APP真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。

3. Dalvik Heap的常见问题

随着测试的执行,随之而来的就是一大堆产生的数据。对产生的数据进行分析,找出可能存在的问题,以及问题可能的原因是接下来的重点。

常见的现象有以下几种:

1)随着功能的反复执行,Heap内存一直在持续增长。这种情况通常是出现了内存泄漏,这种情况最适合用LeakCanary等泄漏检查工具进行白盒测试分析。

2)代码执行时出现了频繁的GC,Heap Alloc内存大幅度波动。这种情况通常是分配了许多临时变量或数组,随后又被迅速回收,这种情况在确定具体场景后适合使用Heap Viewer / Allocation Tracker等工具来查看具体分配的对象。

3)每次启动应用后,Heap内存相比以前版本稳定增长。这种情况通常出现在启动后待机或使用某功能后,可能是由新功能及代码改动引入的固定内存增长。这种情况适合获取Heap Dump后进行多版本或功能使用前后的对此,能够迅速找到增长原因。

4)Heap Alloc变化不大,但进程的Dalvik Heap Pss(Proportional Set Size)内存明显增加。这种情况比较少见,是由于分配了大量小对象造成的内存碎片。

(未完待续)

参考资料:
1. 文档,Android内存分析指南,追逐 编写
2. 《深入理解Java虚拟机:JVM高级特性与最佳实践》,周志明 著,机械工业出版社
3. 《移动App性能评测与优化》,TMQ专项测试团队 编著,机械工业出版社
PS:感谢光荣之路的追逐和悟空老师悉心的指导和热情的帮助,让我获益匪浅!

安装喜马拉雅app,搜索“光荣之路”可以收听吴老和他的朋友们分享的35小时测试知识语音

声明:欢迎非商业用途转载,转载请在明显位置标明“作者、出处、本声明及原文链接”,否则保留追究法律责任的权利。

官网:www.gloryroad.cn

微信公众号:gloryroadtrain

性能测试QQ群:415987441

测试招聘QQ群: 203715128

Java2群:569534627

Python群:457561756

咨询V信:mengqiao626

咨询QQ:53617154

 
光荣之路 更多文章 Android内存监控与分析三部曲(二) Android内存监控与分析三部曲(一) testng--美化报告(七)增加监听 软件测试中的用户思维 testng--美化报告(六)
猜您喜欢 【收网】算算你欠了Java多少钱?Oracle的律师正在赶来的路上 28页PPT详解腾讯数据挖掘体系及应用 多级神经网络结构表达文档语义性能更好吗 全平台自动化测试框架 API 调用次数限制实现