- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
l关于内存泄露检测以及解决的一点心得
关于内存泄露检测以及解决的一点心得
最近遇到几个内存泄露的问题,在解决的过程中也有点收获,下面和大家分享一下,就当做抛砖引玉吧,有写的不对的地方,还请各位大神指点,嘻嘻!
1.内存泄露的检查:
? 作为android和java开发的神器eclipse,在内存泄露的检测方面也是提供了很好的支持,使用eclipse检测内存泄露的具体步骤如下:
? ? a)在eclipse上点击ddms,在devices下面会显示手机里面的进程,选中要测试内存泄露的进程后点击上面的update heap,如下图:
?b)然后再在右边显示的heap选项中点击cause GC,进行一次回收操作,点击后在display区域会显示该进程的内存分配情况,如下图:
?
c)然后再操作要检测内存泄露的应用程序,操作过程中观察display中data object 的Total Size的大小变化情况,该属性对应的是当前进程中所有java对象所占用的内存总量。如果在操作应用程序的过程中,Total Size的大小一直明显增大,并且点击Cause GC后也不会变小,则很大可能就是存在内存泄露。
2.内存泄露原因查找:
?使用eclipse的DDMS按照如上方法只能检测程序有没有发生内存泄露,如果要找到内存泄露的原因,就要借助另外一个神器:eclipse Memory Analyser(mat)。其实这个工具功能非常强大,不仅能检测到内存泄露,还能分析到具体的内存泄露的原因,mat可以作为插件安装在eclipse上,也可以下载单独的客户端安装到电脑上,因为本地电脑网络限制,所以我的电脑是下载的客户端安装到电脑上。下面我结合QELS-4682来讲解一下使用mat分析内存泄露的方法(注:mat功能强大,我也是在解决内存泄露的问题过程中结合网上知识学习了其中的一点知识,没有完全掌握,有兴趣的大神可以自己结合网上知识和官网介绍深入学习,有写的不对的地方,敬请斧正);
? ?使用mat分析内存泄露的话,要获得堆转储文件,该文件可以在DDMS中点击Dump HPROF file来获得,如下图:
??
因为我的mat是客户端版的,所以要不能打开eclipse直接生成的.hprof文件,还需要用工具转换一下,这个工具在sdk的tools文件夹下,,在cmd命令下进入该文件夹后输入 hprof-conv 转换前文件名 转换后文件名,然后用安装好的mat打开该文件就可以开始分析了。如图:
使用mat打开转换后的堆存储文件界面如下图:
上图中,饼状图指出了主要的内存分配情况,下面标红的Histogram和Leak Suspects是找到内存泄露的关键。Histogram会显示内存中存在对象的实例和数目,我们可以在这里面根据应用程序的代码发现哪些对象回收不了导致内存泄露。Leak Suspects指出了可能发生内存泄露的地方以及类的引用关系,在这里也可以找到内存泄露的对象。点击Histogram显示如下图:
从这个图中很明显的可以看到,MSimLockPatternKeyguardView类和Gigabyte_LockScreen在内存中存在40和41个对象,这明显是这两个对象不能被回收导致内存泄露了,然后我们在MSimLockPatternKeyguardView上点击右键选择List objects-with incoming references进入到该对象后,再点击右键选择Path to GC Roots-exclude weak/soft?references查看持有该对象的引用的对象,显示如下图:
在这里我们注意到其中有一个mReceivers,是LoadApk类的成员变量,看到这个名字的时候,很明显我心动了,估计这个应该和广播有点关系,查阅LoadApk的源代码如下:
很明显,mReceivers是一个装着广播接收者的HashMap,而MSimLockPatternKeyguardView之所以不能被回收,也是因为mReceivers间接的持有MSimLockPatternKeyguardView的引用,查看图中和锁屏有关的类,只有MSimLockPatternKeyguardView和MSimKeyguardStatusViewManager,通俗的说就是在MSimLockPatternKeyguardView或者MSimKeyguardStatusViewManager中注册了广播,没有注销,查阅这两个类的代码后,发现MSimKeyguardStatusViewManager中注册了广播没有注销,那么这个内存泄露问题要解决的话只要增加广播的注销就行了。
从Gigabyte_LockScreen类按照上面步骤查看后显示如下图:
从这里可以看出Gig
您可能关注的文档
- I不需要无线路由器一步一步教你如何让手机用WiFi连接笔记本电脑共享上网!.docx
- I公务文书写作的基础知识.doc
- l六年级数学下册期末检测题有答案.doc
- [第2章DreamweaverCS3的基本操作.ppt
- I公务用车使用管理办法.doc
- [第2章Dreamweaver8基础2.ppt
- l六年级数学下册:期末总复习题—综合运用4人教新课标版.doc
- [第2章CPU.ppt
- I与城乡一体化结合的创意产业发展模式研究.doc
- I公司2011年度政研论文.doc
- 剧本杀行业报告:内容创作规范与剧本市场拓展策略.docx
- 剧本杀行业区域市场区域文化特色与市场潜力分析报告.docx
- 剧本杀行业区域市场拓展实战案例研究.docx
- 剧本杀行业区域市场拓展路径与模式探索报告.docx
- 剧本杀行业区域市场竞争态势与品牌差异化策略研究报告.docx
- 剧本杀行业2025年西北区域市场市场细分领域竞争态势与品牌竞争策略分析研究报告.docx
- 剧本杀行业2025年西北市场拓展前景预测报告.docx
- 剧本杀行业2025年长沙市场发展潜力分析报告.docx
- 剧本杀行业2025年长三角市场竞争策略与布局分析.docx
- 医疗行业数据合规:2025年数据安全法实施后的合规监管挑战与应对.docx
文档评论(0)