[转]内存管理 --- 内存使用不当小结
?
?
因为我们的应用程序能够使用的内存有限,所以在编写代码的时候需要特别注意内存
使用问题。如下是一些常见的内存使用不当的情况。?
?⑴查询数据库没有关闭游标?
描述:?
? ? 程序中经常会进行查询数据库的操作,但是经常会有使用完毕 Cursor后没有关闭的情
况。如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操
作的情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险。?
??
示例代码:?
?
?
?
... ... public void operation() { obj = initObj(); ... final Object o = obj; obj = null; mHandler.post(new Runnable() { public void run() { useObj(o); } } } ... ...
?示例B:?
? ? 假设我们希望在锁屏界面(LockScreen)中,监听系统中的电话服务以获取一些信息(如
信号强度等),则可以在LockScreen 中定义一个PhoneStateListener 的对象,同时将它
注册到TelephonyManager 服务中。对于LockScreen 对象,当需要显示锁屏界面的时候
就会创建一个LockScreen 对象,而当锁屏界面消失的时候LockScreen 对象就会被释放
掉。?
? ? 但是如果在释放LockScreen 对象的时候忘记取消我们之前注册的
PhoneStateListener 对象,则会导致LockScreen无法被垃圾回收。如果不断的使锁屏界
面显示和消失,则最终会由于大量的LockScreen 对象没有办法被回收而引起
OutOfMemory,使得system_process进程挂掉。?
? ? 总之当一个生命周期较短的对象A,被一个生命周期较长的对象B保有其引用的情况
下,在A的生命周期结束时,要在 B中清除掉对A的引用。
?
⑸其他?
?
?
Android 应用程序中最典型的需要注意释放资源的情况是在Activity的生命周期中,在
nPause()、onStop()、onDestroy()方法中需要适当的释放资源的情况。由于此情况很基
础,在此不详细说明,具体可以查看官方文档对Activity生命周期的介绍,以明确何时应
该释放哪些资源。?