如何分析 android 的 OOM,与 java 静态代码分析工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
heitao1

如何分析 android 的 OOM,与 java 静态代码分析工具

  •  
  •   heitao1 2016 年 9 月 22 日 12303 次点击
    这是一个创建于 3503 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用 MAT 分析 OOM
    很多 OOM 看似发生在 bitmap 分配得时候,但它一般不是 rootcause 。根本原因都在于本应该自动释放的资源,因为代码的错误,而导致某些对象一直被引用( Reference ),例如 Android 内存优化,如何避免 OOM 文章中提到的 Activity 的 mContext 引用。

    当代码量很庞大的时候,单靠读代码查找错误是很困难的,所以必须借助于工具,这里介绍一款很好用的分析工具 MAT 。

    1 、下载 MAT

    http://www.eclipse.org/mat/downloads.php

    一般我们的开发环境都选择了 Eclipse ,所以直接安装插件版的就可以了。

    2 、使用方法,可以看这篇博文:

    http://www.cnblogs.com/Android-and-android/archive/2013/03/05/2943863.html

    3 、重点理解 Retained Heap 、 GC Root

    http://blog.csdn.net/hhww0101/article/details/8133219

    4 、如何定位

    首 先要知道复现 OOM 的操作步骤,如果是随机测试出的,也需要找到一个有效的复现步骤才行。然后分别取操作前的 .hprof ,和操作后,内存增长后的 .hprof 。如果内存不断增长,可取 3 , 4 次。然后分别打开 直方图( Histogram )视图,在对象列表中,对比每个对象的 Retained size 的变化。

    排在第一位的不一定是泄露对象,有可能它本身正常情况就很消耗内存。

    泄露的对象是那个突然排名上升的。区分方法是看每个对象的内存地址,地址相同的是同一对象(前提是进程一直运行,没有重启过,重启后内存地址就都变了)。

    出 现怀疑对象后,右键 List Objects > with incoming references ,可以排除 WeakReference 等引用,顺着树节点向下找,如果出现程序中的 Activity ,或者某个全局对象,基本就可以确定是它没释放造成的。要更深一步分析为什么没释放,如果逻辑复杂,难于捋清,可以直接做 workaround ,想办法释放这个对象就可以了 (set object = null)。

    java 静态代码分析工具
    写代码过程中难免会有疏漏,我们也可以借助工具分析,这里是常用的 java 静态代码分析工具:

    http://www.oschina.net/question/129540_23043

    个人觉得 Find Bugs 和 PMD 就可以了,只是辅助,不必过分依赖,他并不是万能的,不是所有错误都能找出来。

    转自: http://www.yinqisen.cn/blog-315.html
    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     966 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 18:20 PVG 02:20 LAX 11:20 JFK 14:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86