Android
手机给应用分配的内存通常是8兆左右,如果处理内存处理不当很容易造成OutOfMemoryError
OutOfMemoryError
主要由以下几种情况造成:
- 数据库
Cursor
没关。
当我们操作完数据库后,一定要调用close()
释放资源。 - 构造
Adapter
没有使用缓存convertView。 - 未取消注册广播接收者,
registerReceiver()
和unregisterReceiver()
要成对出现,通常需要在Activity
的onDestory()
方法去取消注册广播接收者。 - IO流未关闭
注意用完后及时关闭 - Bitmap使用后未调用recycle()。
- Context泄漏。 这是一个很隐晦的OutOfMemoryError的情况。先看一个Android官网提供的例子
private static Drawable sBackground; @Override protected void onCreate(Bundle state) { super.onCreate(state); TextView label = new TextView(this); label.setText("Leaks are bad"); if (sBackground == null) { sBackground = getDrawable(R.drawable.large_bitmap); } label.setBackgroundDrawable(sBackground); setContentView(label); }
这段代码效率很快,但同时又是极其错误的:
Drawable
拥有一个TextView
的引用,而TextView
又拥有Activity
(Context类型)的引用,Drawable
拥有了更多的对象引用。即使Activity
被销毁,内存仍然不会被释放。
另外,对Context的引用超过它本身的生命周期,也会导致Context泄漏。所以尽量使用Application这种Context类型。所以如果打算保存一个长时间的对象时,要使用getApplicationContext()
。
最近遇到一种情况引起了Context
泄漏,就是在Activity
销毁时,里面有其他线程没有停。总结一下避免Contex
t泄漏应该注意的问题:
- 使用
getApplicationContext()
类型。 - 注意对
Context
的引用不要超过它本身的生命周期。 - 慎重的使用
static
关键字。 Context
里如果有线程,一定要在onDestroy()
里及时停掉。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步