微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 消费类电子 > Android程序的内存泄漏与规避方法

Android程序的内存泄漏与规避方法

时间:01-04 来源:3721RD 点击:

4内存监测工具DDMS和内存分析工具MAT

4.1 内存监测工具DDMS

  我们在开发Android应用程序时,很容易造成内存的泄漏,这时需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的不良代码。在Android tools的DDMS里面带有一个内存监测工具Heap,用它来监测应用程序使用内存的情况,这里需要和Eclipse配合使用。利用 Heap工具监测应用进程使用内存情况的方法如下:

① 首先启动Eclipse,切换到DDMS透视图,并确认Devices视图、Heap视图都已打开。将要测试的设备(比如手机)通过USB数据线连接到电脑上,连接成功后,会在DDMS的Devices视图界面中显示手机设备的序列号,以及设备中正在运行的部分进程信息。

② 然后选中想要监测的进程,比如system_process进程,进而选中Devices视图界面中最上方一排图标中的"Update Heap"图标,点击Heap视图中的"Cause GC"按钮,此时在Heap视图中就会看到当前选中的进程的内存使用量的详细情况。

③ Heap视图界面会定时地刷新正在监测的进程内存使用情况,通过不断地操作被监测的应用程序来观察内存使用的变化。

  那么如何才能知道被监测的应用程序是否存在内存泄漏呢?这里需要注意一个值:Heap视图中有一个类型值叫做data object,即数据对象。在data object一行中有一列是"Total Size",其值就是当前进程中所有Java数据对象的内存总量。一般情况下,这个值的大小决定了应用程序是否存在内存泄漏。我们不断地操作当前应用,同时注意观察data object的Total Size值,正常情况下Total Size的值都会稳定在一个有限的范围内,也就是说由于程序中的代码良好,没有造成对象不被垃圾回收的情况,内存占用量保持在了一个相对稳定的水平;反之,如果代码中存在没有释放对象引用的情况,则data object的Total Size值会随着操作次数的增多越来越大,直到到达一个上限后导致进程被杀掉。

  通过上面的分析,使用DDMS的Heap视图工具可以很方便地确认应用程序是否存在内存泄漏的问题。

4.2 内存分析工具MAT

  通过DDMS工具可以判断应用程序中是否存在内存泄漏的问题,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?内存分析工具MAT Memory Analyzer Tool解决了这一难题。MAT工具是一个Eclipse 插件,同时也有单独的RCP 客户端,MAT工具的解析文件是.hprof,这个文件存放了某进程的内存快照。MAT工具定位内存泄漏具体位置的方法如下:

① 生成.hprof文件。Eclipse中生成.hprof文件的方法有很多,不同Android版本中生成.hprof的方式也稍有差别,但它们整体思路是一样的。我们在DDMS界面选中想要分析的应用进程,在Devices视图界面上方的一行图标按钮中,同时选中"Update Heap"和"Dump HPROF file"两个按钮,这时DDMS将会自动生成当前选中进程的.hprof文件。

② 将.hprof 文件导入到MAT工具中,MAT工具会自动解析并生成报告,点击"Dominator Tree"按钮,并按包分组,选择已定义的包类点右键,在弹出的菜单中选择List objects﹥With incoming references,这时会列出所有可疑的类。右键点击某一项,并选择Path to GC Roots﹥exclude weak/soft references,MAT工具会进一步筛选出跟程序相关的所有内存泄漏的类。这样就可以追踪到某一个产生内存泄漏的类的具体代码中。

  使用MAT内存分析工具查找内存泄漏的根本思路是找到哪个类的对象的引用没有被释放,然后分析没有被释放的原因,最终定位到代码中哪些片段存在着内存泄漏。

结语

  Android应用程序中内存泄漏是一个特别重要但又难以解决的问题,不再有用的对象被其他依然有用的对象所引用是导致内存泄漏的主要原因。程序员良好的编程风格和专业的检测工具可以有效地减少内存泄漏的问题,比如上面介绍的内存监测工具DDMS和内存分析工具MAT。但如何更好地避免甚至消除内存泄漏、如何解决因内存泄漏而导致的Android应用程序系统性能下降问题,将是内存泄漏相关领域的重要研究方向。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top