资源预览内容
第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
亲,该文档总共6页全部预览完了,如果喜欢就下载吧!
资源描述
Android 应用程序内存泄漏的分析以前在学校里学习Java的时候,总是看到说,java是由垃圾收集器(GC)来管理内存回收的, 所以当时形成的观念是 Java 不会产生内存泄漏,我们可以只管去申请内存,不需要关注内存回收, GC 会帮我们完成。呵呵,很幼稚的想法, GC 没那么聪明啊,理论及事实证明,我们的 Java 程序也 是会有内存泄漏的。(一)Java 内存泄漏从何而来一般来说内存泄漏有两种情况。一种情况如在C/C+语言中的,在堆中的分配的内存,没 有将其释放,或者是在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指 针重新赋值);另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它 的访问方式(引用)。第一种情况,在 Java 中已经由于垃圾回收机制的引入,得到了很好的解 决。所以, Java 中的内存泄漏,主要指的是第二种情况。(二)需要的工具1. DDMSUpdate heap Gause GCHeap 是 DDMS 自带的一个很不错的内存监控工具,下图红色框中最左边的图标就是该 工具的启动按钮,它能在 Heap 视图中显示选中进程的当前内存使用的详细情况。下图 框中最右边的是 GC 工具,很多时候我们使用 Heap 监控内存的时候要借助 GC 工具,点 击一次GC按钮就相当于向VM请求了一次GC操作。中间的按钮是Dump HPROF file,它 的功能相当于给内存拍一张照,然后将这些内存信息保存到 hprof 文件里面,在使用我 们的第二个工具MAT的时候会使用到这个功能。Q Devices 亦家9 l9i 口 SName丿 g 33c20844Lall357Online71571Gom.tenc&nt. q p-lus ;core69&3com.ten cent q p lus:main6997e2. MAT(Memory Analyzer Tool)Heap 工具能给我们一个感性的认识,告诉我们程序当前的内存使用情况和是否存在内存 泄漏的肯能性。但是,如果我们想更详细,更深入的了解内存消耗的情况,找到问题所 在,那么我们还需要一个工具,就是MAT。这个工具是需要我们自己去下载的,可以下 载独立的 MAT RCP 客户端,也可以以插件的形式安装到 Eclipse 里面,方便起见,推荐 后者。安装方法:A. 登录官网 http:/www.eclipse.org/mat/downloads.phpB. 下载MAT Eclipse插件安装包(红框所示,当然你也可是选择Update Site在线安装, 个人觉得比较慢) Verston: 1.1.1.201108241 Date: 23 September 2011 |Type: Fteleasecf Update Site: http;11 dov/nIoa d.&cli psorg/matT1.1 /update-s Archiv&d Update Sit&: MmoryAnafyz&r-l.1.1.20110824073&.zip (11,8 MS) Stand-alone EclipseRCPApplicatioFisC 安装在 Eclipse 里面安装新软件,选择刚才下载的本地安装包进行安装看夺Asfchiwe.ma菩邑一-廿云“P Group iteiJ Contact a Add epositorv名钢:Local.恵:L): Repcsitor, archive丄计即宀铝Kfi (C:)-.卓i:Euffi匚e20Q7正版2CH1/12/10 iD8 文禅吴3 M EmofAnalyzer-l .L. i.201L&E240735.20L_ .2 2L _5: j2 zip Archive血二zip*打刑卬三) 案例分析工具准备好了,那就来看看怎么使用。我们以Q+ for Pad为例,看看查找好友功能是否存在 内存泄漏。1. 打开 eclipse 并切换到 DDMS 透视图,同时确认 Devices 、 Heap 和 logcat 视图已经打 开了。2. 将Pad设备链接到电脑,并确保使用“ USB调试”模式链接3. 启动我们的Q+ for Pad应用,此时我们能看到下图所示的情况,Q+ Pad有两个进程4.选中main进程,点击Update Heap按钮,再点击GC按钮,查看该进程当前堆内存的使用 情况S Devices SS匸目 Threads 自 Allocation Tracker File Explorer I 3 H&ap 僞I l i . “ ,._ 卽Htdp updates will happcr after eveNameIDHeap SizeAllocatedFree% Used埜 Objects| Cause GC |33c2&B441all.357115.945 MB14.156 VE1.790 MB&B.7B%70,3237Display:Stats co m.ten 匚 ent.q p lu ;匚口匕co m.ter cent.q p In方:m a inTypm匚 ountTotal SizeSmallestLargestfree3.1411.764 MEl&B272.226 KB1 data object4&s0971S53 MB1& B864 Bclass object2,61472 6. S3 6 KB34.641 KB1-hyte array (bytefl, booleanOJ2.29210.760 MB2Q B3.06 MB2-byte array(Ehortf, charlll1Z34&O6.367 KB24 G2 .023 KB4-oyte array (obiectn. intf tlaat-l) 4s6S9226.D7O KB24 G16.022 KB8-hyte snay (long fl, doublej2S316.626 KB劄G4.000 KBnar-Js/a object29S26.125 KB16 Ga.O22 KB如何才能知道我们的程序是否有内存泄漏的可能性呢。这里需要注意一个值: Heap 视 图中部有一个Type叫做data object,即数据对象,也就是我们的程序中大量存在的类 型的对象。在data object 一行中有一列是Total Size,其值就是当前进程中所有Java 数据对象的内存总量,一般情况下,这个值的大小决定了是否会有内存泄漏。可以这样 判断:a)不断的操作当前应用,同时注意观察 data object 的 Total Size 值;b)正常情况下Total Size值都会稳定在一个有限的范围内,也就是说由于程序中的的代 码良好,没有造成对象不被垃圾回收的情况,所以说虽然我们不断的操作会不断的生成很多对象,而在虚拟机不断的进行GC的过程中,这些对象都被回收了,内存占用量会 会落到一个稳定的水平;c)反之如果代码中存在没有释放对象引用的情况,则data object的Total Size值在每 次GC后不会有明显的回落,随着操作次数的增多Total Size的值会越来越大,直到到 达一个上限后导致进程被 kill 掉。5. 输入昵称,查找联系人,在查到的结果中不断向下翻页,最后退出(这个时候程序会不 断的拉取联系人的头像,这是我们要关注的),然后我们点击下 GC 按钮,手动触发下垃 圾回收,结果截图如下,图中红色标记的地方可以看出,执行查找联系人操作后,这两个数值明显增加了,GC操作也无法使之下降,我们可以怀疑,这个操作导致了内存泄漏。冒 Dbvicbk 3、d 鬥Nameg 43C7M3413053D7ca m.tencent.m ini hd.qqca rriitencent.qp lus;ca recc m.tencEint.qplus:mai n驾 Threads Q Allocation Tracker File Eplcrer Q H&sp,Z3IDHeap SizeAllocaLed .Free% Used# Objects131.570 ME27.311 MB4.259 MB86.51%125.329-Cause GCDisplay: Stati 打fypm匚 cuntTcHal Size5mallEtLarge-stfree651-1.234 MEL&E517&7 KET白匸谒abject91J703.267 MB |15 B1.073 KB匸|曰于为object3,001811.33&KBl&BB34.336 KB1-byte* array fbytn. boDleanfll42151 21133 MB I24 B3.906 MB2-bjrte arraj (short!, charU)19.1S21.587 MB24 B2&O23 KE4-byte array (objertD. intfl, floatQjZ173525.025 KE24 61&O23 KBB-byte array (longD.doubleQ)1S.555 KB24 64000 KEnon-Java ohjeet4DL26.359 KB1& Ea.D23 KEHeap updates ivill happen after eveii GC for this client6. 使用 MAT 进一步分析,找到问题的根源。之前我们已经安装了 MAT 插件,所以这里我们只要选中main进程,点击Dump HPROF file按钮,就会跳转到MAT视图。在弹出的对 话框中选择报告类型,一般选第一个就行。 Getting Started WizardlnGetEimg ScriedChooP one of the tcrrimon rppoii bHov. :ifp5.s Escape to clos-e this dialog.a Leak Suspects ReportAutomeiti匚臼lly check the heap dump for lesksuspe-cts, R.epcxt what objects are kept alive ardwhy they arB not garbage collectedCrnporient FtEpcrtAnalyze a sec o-f objects far eueperted merriDi
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号