Android程序的内存泄漏与规避方法
② 然后选中想要监测的进程,比如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应用程序系统性能下降问题,将是内存泄漏相关领域的重要研究方向。
评论