关于android内存泄露

      说实话,我app做的不多,一半精力是在关注framework层和底层,最近有个人问我android内存泄露的问题,我就上网找了些资料看看,发现列举了很多条情况,1、2、3、4.....,而且很多都是抄袭,却没人真正去总结下根本原因,我说下自己的想法,欢迎讨论!

      内存泄露可以说有两个根本原因:1、申请的资源没有被释放;2、长生命周期对象持有短寿命周期的对象的引用,使得gc无法回收。

      1.资源释放的问题。

      很明显的就是socket io,file这一类。这两个很明显就是操作系统管理的,你说你要是不关闭,gc能帮你处理吗?还有就是bitmap,之前看了点bitmap底层代码,其实java层的bitmap只是一个api而已,实际的操作其实是底层c/c++的代码,稍微有点c++基础的程序员都知道要delete才能释放资源。还有cursor,没研究过,知道的人可以告诉我,数据库研究的不多。

      2.引用的持有问题

      这就是java基础问题了。长生命周期的对象,比如Static、Thread、AsyncTask等;引用的持有可以使直接传入的,也可能是非静态内部类隐性持有外部对象的引用(这个要注意,比较隐蔽)。解决方法有使用Weakeference,内部类设置为静态的,以消除这种持有关系。有一种是注册add listener & remove listener,其实也是属于消除别人对这个listener的引用的持有(add的时候会持有),而非资源。

      3.哎,你不是说只有2点吗,但是由于android的特殊性,有一点要特别强调下,就是有一个东西的生命周期特别长,就是android框架,这就要求你要对android framework比较熟悉,其实本质上这一块还是属于第二点。比如message传入一个activity,然后把message放入消息队列,只要这个消息没有处理(比如把delay设置的很长),activity就不会被回收。再比如register BroadcastReceiver,如果不unregister,框架就会一直持有这个receiver的引用(怎么持有的没研究,看看源码吧)

      我没有详细解释哪些内存泄露的情况,只是做了一个总结。有兴趣的可以把别人写的东西跟我说的对照下,看能不能找到对应的分类,欢迎补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值