内存LeakCanary傻瓜式的内存泄露检测工具

内存检测工具  时间:2021-01-12  阅读:()

LeakC anary傻瓜式的内存泄露检测工具

在Andr oid开发过程中如果需要处理图片或者大量数据的时候常常会遇到OOM(java. lang.OutOf Memor yErro r),一般出现最多的是在创建Bitm ap上也有可能是在内存中处理了大量的数据造成。

一般会针对Bitam p做下面几种的优化:

1.增加进程的内存

2.使用Bit map.Confi g.ALPHA_8(图片失真)

3.显示的调用Syste m.gc()

4. catch Excep tion

5.调用bit map.recyc le()

6.缩小bitmap的大小(如果是读取的原图是一个大图应该先采用这种方式 Bitma p如果是刚好适配屏幕的就不需要缩小了)

7.使用弱引用和软引用(googl e已经不建议使用了,Andro id的GC效率非常高只要保证对象没有被引用即可)

但是我们会忽略掉一个问题就是什么造成了OOM?一般都发生OOM崩溃的地方都不一定是内存泄露的地方崩溃了的原因可能Ac tivit y造成的内存泄露也可能是操作数据库造成的内存泄露 当内存已经非常接近峰值的时候这个时候恰巧要创建一个Bitm ap对象就会发生OO M(Bitma p对象占用的内存空间比较大) 。

内存泄露

每个对象都有自己的生命周期Activ ity会调用onDe stroy做销毁处理但是如果使用Acti vity的Conte xt调用T oast,就会把这个Activ ity的引用传给了T oast,而Toas t的生命周期不会随着Activ ity的销毁而销毁,这样就造成了Acti vity的内存泄露 因为它被T oast引用着。

常见的内存泄露形成的原因:

1. Toast持有Act ivity的引用

2.数据库游标Curso r没有关闭

3. Adapt er没有复用conv ertVi ew

4.对象被生命周期更长的对象引用 Activ ity被静态集合引用

. . . .

监控内存的方式

Heap Dump是一种Jav a比较常用的检测内存的方式简单来说就是我们在一个初始状态A Dump一次内存在做了一些操作之后回到状态A再Dump一次内存。

对两次Du np的内存数据(hprof )使用分析工具做分析(MAT) ,根据分析的结果就能知道是否存在内存泄露这种方式比较复杂和繁琐并不是特别易用。

Moito rs:Andro idSDK 自带的内存监控工具Monit ors能看到内存的变化内存是增加还是减少.打开一个A ctivi ty会导致内存增加关闭一个A ctivi ty会导致内存减少反复的实验如果每次打开一个Ac tivit y再关闭之后增加的内存不会减少就说明这个Activ ity有内存泄露的问题可以使用l og辅助进行检测这种方式的缺点是并不是特别的准确 因为内存的释放和对象的生命周期有关也和GC的调用有关。

而Leak Canar y就是一个简单的方便的内存检测工具可以轻易的发现内存问题还会生成更加简单清晰的报告。

LeakC anary

LeakC anary是一个开源的检测内存泄露的ja va库。项目地址 https

://githu b.com/squar e/leakc anary

LeakC anary实际上就是在本机上自动做了He ap dump对生成的h prof文件进行分析展示结果。和手工分析Heap Dump的方式得到的结果是一样的。

下面是一个LeakC anary的结果截图 

集成Lea kCana ry

在buil d.gradl e添加依赖depen denci es {debug Compi le 'com. squar eup. leakc anary :leakc anary -andro id:1.3. 1'relea seCom pile 'com. squar eup. leakc anary :leakc anary -andro id-no-op: 1.3. 1'testC ompil e 'com. squar eup. leakc anary :leakc anary -andro id-no-op: 1.3. 1'

}

使用Lea kCana ry会影响程序的性能尤其是在H eap dump和分析操作时不过我们可以在依赖里面指定对应的版本debug的时候才进行分析relea se的时候不进行分析。debug Compi le可以使用检测版本 com. squar eup. leakc anary :leakc anary -andro id relea seCom pile使用no-op模式 即No Opera tion Perfo rmed就是不会把对应的类库编译,指定类库为无用的指令:com. squar eup. leakc anary :leakc anary -andro id-no-op设置L eakCa nary为无用指令。

然后在Ap plica tion中加入分析A ctivi ty的代码

publi c class Examp leApp licat ion exten ds Appli catio n{

@Overr ide publi cvoid onCre ate() {super .onCre ate() ;

LeakC anary .insta ll(this) ;

}

}

这样就可以检测Act ivity的内存泄露了。 内部实现使用了Act ivity Lifec ycleC allba cks方法监控所有A ctivi ty的生命周期。

检测其他对象

LeakC anary中提供了R efWat cher类可, 以用来监控所有的对象。

首先需要实例化Ref Watch er:publi c stati c RefWa tcher sRefW atche r=LeakC anary .insta ll(mCont ext) ;

对于监控的对象使用sRefW atche r.watch (this)

一般我们是在对象销毁的时候对对象进行监控,比如内部实现的对于A ctivi ty的监控:priva tefinal Activ ityLi fecyc leCal lback slifec ycleC allba cks=newActiv ityLi fecyc leCal lback s() {publi c void onAct ivity Creat ed(Activ ity activ ity, Bundl esaved Insta nceSt ate) {

}publi cvoid onAct ivity Start ed(Activ ity activ ity) {

}

publi cvoid onAct ivity Resum ed(Activ ity activ ity) {

}publi cvoid onAct ivity Pause d(Activ ity activ ity) {

}publi cvoid onAct ivity Stopp ed(Activ ity activ ity) {

}publi c void onAct ivity SaveI nstan ceSta te(Activ ity activ ity,Bundl e outSt ate) {

}publi cvoid onAct ivity Destr oyed(Activ ity activ ity) {

Activ ityRe fWatc her. this.onAct ivity Destr oyed(activ ity) ;

}

} ;

只是在on Activ ityDe stroy ed的时候才对于ac tivit y进行了监控。

如何解决内存泄露

一般情况内存泄露的原因都是由于引用的使用不当造成的而且And roid的

GC能够保证回收循环引用(如果一个循环引用没有外部引用时就会被回收)而且And roid的GC效率很高当然GC的算法本身也在不停的改进。

一般情况下我们尽量避免错误的引用方式带来的内存泄露问题

1.生命周期长的对象引用生命周期短的对象 比如sta tic的对象群引用A ctivi ty

2.使用App licat ion的C ontex t对象而不是Ac tivit y的Con text

3.避免非静态类的内部类对于类的隐式引用使用静态的内部类

4.使用And roid的缓存机制 比如Lis tView的复用机制

5.手动关闭资源比如Cur ous的关闭

6. regis terRe ceive r和unR egist erRec eiver成对出现

弘速云香港VPSVPS线路有CN2+BGP、CN2 GIA,KVM虚拟化架构,裸金属月付564元

弘速云怎么样?弘速云是创建于2021年的品牌,运营该品牌的公司HOSU LIMITED(中文名称弘速科技有限公司)公司成立于2021年国内公司注册于2019年。HOSU LIMITED主要从事出售香港vps、美国VPS、香港独立服务器、香港站群服务器等,目前在售VPS线路有CN2+BGP、CN2 GIA,该公司旗下产品均采用KVM虚拟化架构。可联系商家代安装iso系统。点击进入:弘速云官方网站地址...

美国云服务器 2核4G限量 24元/月 香港云服务器 2核4G限量 24元/月 妮妮云

妮妮云的来历妮妮云是 789 陈总 张总 三方共同投资建立的网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑妮妮云的市场定位妮妮云主要代理市场稳定速度的云服务器产品,避免新手购买云服务器的时候众多商家不知道如何选择,妮妮云就帮你选择好了产品,无需承担购买风险,不用担心出现被跑路 被诈骗的情况。妮妮云的售后保证妮妮云退款 通过于合作商的友好协商,云服务器提供2天内全额退款到网站余额,超过2天...

乐凝网络支持24小时无理由退款,香港HKBN/美国CERA云服务器,低至9.88元/月起

乐凝网络怎么样?乐凝网络是一家新兴的云服务器商家,目前主要提供香港CN2 GIA、美国CUVIP、美国CERA、日本东京CN2等云服务器及云挂机宝等服务。乐凝网络提供比同行更多的售后服务,让您在使用过程中更加省心,使用零云服务器,可免费享受超过50项运维服务,1分钟内极速响应,平均20分钟内解决运维问题,助您无忧上云。目前,香港HKBN/美国cera云服务器,低至9.88元/月起,支持24小时无理...

内存检测工具为你推荐
独立ip空间大家都来看看,下面哪个独立IP空间好vps试用求永久免费vps服务器(要永久的)代理主机如何将我工作的电脑设置为代理主机 让我回家以后可以用家里的电脑连接店里的主机访问网络美国vps租用如何选择国外vps服务器?海外域名外贸网站如何选择合适的海外域名?域名备案域名怎么进行备案?什么是虚拟主机什么是“虚拟主机”?请解释祥细些!万网虚拟主机如何购买万网的虚拟主机?虚拟主机测评哪一种虚拟主机比较好用?青岛虚拟主机阿里云主机青岛好还是杭州好
域名转让网 高防服务器租用 日本动态vps 免费ftp空间申请 英文站群 卡巴斯基官方免费版 ftp教程 web服务器的架设 河南m值兑换 工作站服务器 tna官网 广州服务器 卡巴斯基免费试用 免费网页空间 电信托管 宏讯 独享主机 网购分享 web应用服务器 什么是web服务器 更多