内存机制

内存溢出(out of memory)

内存溢出是指当对象的内存占用已经超出分配内存的空间大小,这时未经处理的异常就会抛出。比如常见的内存溢出情况有:bitmap过大;引用没释放;资源对象没关闭
常见的Bitmap过大所导致的内存溢出

如图,这是常见的bitmap对象的溢出,显示像素过高或图片尺寸远远大于显示空间的尺寸时,通常都要将其缩放,减小占用内存。

内存泄漏(memory leak)

有些对象只有有限的生命周期。当它们的任务完成之后,它们将被垃圾回收。如果在对象的生命周期本该结束的时候,这个对象还被一系列的引用,这就会导致内存泄漏。随着泄漏的累积,app将消耗完内存。 比如,在Activity.onDestroy()被调用之后,view树以及相关的bitmap都应该被垃圾回收。如果一个正在运行的后台线程继续持有这个Activity的引用,那么相关的内存将不会被回收,这最终将导致OutOfMemoryError崩溃。 memory leak会最终会导致out of memory!

内存机制_第1张图片
内存泄漏
如图,这是使用MAT工具查找内存泄漏的结果,例子是 handle 延时发送 message 而在关闭 activity 后 context 被销毁所引发的泄漏,这是作为目的性的 测试所以问题比较容易找到,在实际开发中内存泄漏不易察觉并难以找到,当泄漏累积到一定程度是会引发 OOM 的。
内存泄漏的原因
比如当你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。 1.资源对象没关闭
如Cursor,File等资源。他们会在finalize中关闭,但这样效率太低。容易造成内存泄漏 SQLiteCurost,当数据量大的时候容易泄漏

2.使用Adapter时,没有使用系统缓存的converView 3.没有即时调用recycle()释放不再使用的bitmap 4.使用application的context来替代activity相关的context
不要让生命周期长于Activity的对象持有到Activity的引用

5.广播注册没取消造成内存泄露 6.Handler应该申明为静态对象, 并在其内部类中保存一个对外部类的弱引用。
内存泄漏检测工具
leakcanary

你可能感兴趣的:(内存机制)