Android 内存泄漏——检测

只有当某个对象不再被引用时,它的内存才会被回收,当该被释放的对象引用仍然存在时就会发生内存泄漏。从Android文档中看到的一个典型的例子是,由于屏幕旋转(如坚屏转为横屏),整个Activity会有泄漏。这个典型的例子很容易重现,也是相当严重的,因为Activity对象占用相当多的内存(往往包含了多个对象的引用)。避免内存泄漏没有简单的解决方案,但Android提供的工具和API可以提供些帮助。

常用工具DDMS,这个工具是不会告诉你是否存在内存泄漏的,但可以用它来分析应用 的内存使用情况,找出应用中的内存泄漏。

 

Android 2.3定义了StrictMode类,它对检测潜在的内存泄漏有很大的帮助。虽然在Android2.3中,StrictMode的虚拟机策略只能检测到SQLite对象(如游标)没有关闭时产生的泄漏,但在Android3.0及以上上版本中,可以检测以下潜在的泄漏:

  • Activity泄漏;
  • 其他对象泄漏;
  • 对象没有关闭造成的泄漏(至于是哪些对象,可以到Android文档中查看实现了Closeable接口的所胡类)。

使用StrictMode类来检测内存泄漏。些功能仅在开发和测试时开启,应用发布时要禁用。如下:

public class MyApplication extends Application {
	@Override
	public void onCreate(){
		super.onCreate();
		StrictMode.Vmpolicy.Builder builder = new StrictMode.VmPolicy.Builder();
		builder.detectLeakedSqlLiteObjects();
		if(VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
			builder.deteActivityLeaks().detectLeakedClosableObjects();
		}
		//或者可以简单地调用builder.detectAll();
		//采取措施
		builder.penaltyLog();//若有其他措施(如penaltyDeath()),可以在这合并处理
 
		StrictMode.VmPolicy vmp = builder.build();
		StrictMode.setVmPolicy(vmp);
	}
}

 


在这个特定的实例中,当可关闭的对象(SQLite或其他对象)没有关闭时,StrictMode会检测到违规操作,并只将结果写到日志中。要验证行为,可以试一下,查询数据库,故意忘记关闭返回的游标。

现在StrictMode功能增强了,建议只使用detectAll(),随着Android版本的更新,它也会将新功能加进来一起检查。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值