《2022年Android应用程序内存泄漏的分析[整 .pdf》由会员分享,可在线阅读,更多相关《2022年Android应用程序内存泄漏的分析[整 .pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Android 应用程序内存泄漏的分析以前在学校里学习Java 的时候,总是看到说,java 是由垃圾收集器(GC )来管理内存回收的,所以当时形成的观念是Java 不会产生内存泄漏,我们可以只管去申请内存,不需要关注内存回收,GC会帮我们完成。呵呵,很幼稚的想法,GC没那么聪明啊,理论及事实证明,我们的Java程序也是会有内存泄漏的。(一)Java 内存泄漏从何而来一般来说内存泄漏有两种情况。一种情况如在C/C+ 语言中的,在堆中的分配的内存,没有将其释放,或者是在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值) ;另一种情况则是在内存对象明明已经不需要的时候,还仍
2、然保留着这块内存和它的访问方式(引用) 。第一种情况,在Java 中已经由于垃圾回收机制的引入,得到了很好的解决。所以, Java 中的内存泄漏,主要指的是第二种情况。(二)需要的工具1.DDMSUpdate heap Gause GC Heap 是 DDMS 自带的一个很不错的内存监控工具,下图红色框中最左边的图标就是该工具的启动按钮,它能在Heap 视图中显示选中进程的当前内存使用的详细情况。下图框中最右边的是GC工具,很多时候我们使用Heap 监控内存的时候要借助GC工具,点击一次 GC按钮就相当于向VM 请求了一次GC操作。中间的按钮是Dump HPROF file ,它的功能相当于给
3、内存拍一张照,然后将这些内存信息保存到hprof 文件里面,在使用我们的第二个工具MAT 的时候会使用到这个功能。2.MAT(Memory Analyzer Tool) Heap 工具能给我们一个感性的认识,告诉我们程序当前的内存使用情况和是否存在内存泄漏的肯能性。但是,如果我们想更详细,更深入的了解内存消耗的情况,找到问题所在,那么我们还需要一个工具,就是MAT。这个工具是需要我们自己去下载的,可以下载独立的MAT RCP 客户端,也可以以插件的形式安装到Eclipse里面,方便起见,推荐后者。安装方法:A 登录官网http:/www.eclipse.org/mat/downloads.ph
4、pB 下载 MAT Eclipse 插件安装包(红框所示,当然你也可是选择Update Site 在线安装,个人觉得比较慢)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - C 安装在 Eclipse里面安装新软件,选择刚才下载的本地安装包进行安装(三)案例分析工具准备好了,那就来看看怎么使用。我们以Q+ for Pad 为例,看看查找好友功能是否存在内存泄漏。1.打开 eclipse 并切换到 DDMS 透视图, 同时确认 De
5、vices 、 Heap 和 logcat 视图已经打开了。2.将 Pad 设备链接到电脑,并确保使用“ USB 调试 ” 模式链接3.启动我们的Q+ for Pad 应用,此时我们能看到下图所示的情况,Q+ Pad有两个进程4.选中 main 进程, 点击 Update Heap 按钮,再点击 GC按钮,查看该进程当前堆内存的使用情况名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 6 页 - - - - - - - - - 如何才能知道我们的程序是否有内存泄漏的可能性呢
6、。这里需要注意一个值:Heap视图中部有一个Type 叫做 data object ,即数据对象,也就是我们的程序中大量存在的类型的对象。在data object 一行中有一列是“Total Size” ,其值就是当前进程中所有Java数据对象的内存总量,一般情况下,这个值的大小决定了是否会有内存泄漏。可以这样判断:a) 不断的操作当前应用,同时注意观察data object的 Total Size 值;b) 正常情况下Total Size 值都会稳定在一个有限的范围内,也就是说由于程序中的的代码良好,没有造成对象不被垃圾回收的情况,所以说虽然我们不断的操作会不断的生成很多对象,而在虚拟机不断
7、的进行GC 的过程中,这些对象都被回收了,内存占用量会会落到一个稳定的水平;c) 反之如果代码中存在没有释放对象引用的情况,则data object 的 Total Size 值在每次 GC 后不会有明显的回落,随着操作次数的增多Total Size 的值会越来越大,直到到达一个上限后导致进程被kill 掉。5.输入昵称,查找联系人,在查到的结果中不断向下翻页,最后退出(这个时候程序会不断的拉取联系人的头像,这是我们要关注的),然后我们点击下GC按钮,手动触发下垃圾回收,结果截图如下,图中红色标记的地方可以看出,执行查找联系人操作后,这两个数值明显增加了, GC操作也无法使之下降, 我们可以怀
8、疑, 这个操作导致了内存泄漏。6.使用 MAT 进一步分析,找到问题的根源。之前我们已经安装了MAT 插件,所以这里我名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 6 页 - - - - - - - - - 们只要选中main 进程,点击 Dump HPROF file按钮,就会跳转到MAT 视图。在弹出的对话框中选择报告类型,一般选第一个就行。点击完成后, MAT 会自动生成报告,列出几个内存占用比较大的可疑对象,MAT 不会明确告诉我们这就是泄露,因为它也不知道这个
9、东西是不是程序还需要的,只有程序员自己知道。图中很明显的占用内存较大的是头像资源,并且当退出查找联系人功能后,这些资源是需要释放的,陌生人的头像我们不需要缓存在内存里面。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 6 页 - - - - - - - - - 点击 Domain Tree 按钮,可以按包进行分组。点开树形列表,可以更详细的看到类对象占用内存的大小。其中,Shallow Heap 表示实例的内存使用总和,Retained Heap 表示所有类实例被分配的内
10、存总和,里面也包括他们所有引用的对象。从生成的数据中,我们发现有一千多个HashMapEntry 对象,针对单个HashMapEntry 对象继续追踪,最后找到了一个6KB左右的 Bitmap ,应该就是我们的头像资源。因此,为了回收内存,我们必须把刚才查找好友保存在内存中的头像资源释放。通过使名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 6 页 - - - - - - - - - 用 Heap 和 MAT 工具,能够更好的帮助测试人员发现及定位内存泄漏问题,也能帮助我们发下性能问题,找到内存优化的点。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -