Android内存泄露的原因
2016-10-17 09:19
218 查看
小山拉家常 2016-10-16 23:13
资源对象没关闭。
如Cursor、File等资源。他们会在finalize中关闭,但这样效率太低。容易造成内存泄露。
SQLiteCursor,当数据量大的时候容易泄露
使用Adapter时,没有使用系统缓存的converView。
即时调用recycle()释放不再使用的Bitmap。
适当降低Bitmap的采样率,如:
BitmapFactory.Options options = newBitmapFactory.Options();
options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一
Bitmap bitmap =BitmapFactory.decodeStream(cr.openInputStream(uri), null, options); preview.setImageBitmap(bitmap);
使用application的context来替代activity相关的context,不要让生命周期长于Activity的对象持有到Activity的引用。尽量避免activity的context在自己的范围外被使用,这样会导致activity无法释放。
注册没取消造成内存泄露
如:广播
集合中的对象没清理造成的内存泄露我们通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。
Handler应该申明为静态对象, 并在其内部类中保存一个对外部类的弱引用。如下:
static class MyHandler extends Handler {
WeakReference<Activity > mActivityReference;
MyHandler(Activity activity){
mActivityReference= new WeakReference<Activity>(activity);
}
@Override
public void handleMessage(Message msg){
final Activity activity = mActivityReference.get();
if (activity != null){
mImageView.setImageBitmap(mBitmap);
}
}
}
尽量不要在Activity中使用非静态内部类,因为非静态内部类会隐式持有外部类实例的引用(具体可以查看细话Java:”失效”的private修饰符了解)。如果使用静态内部类,将外部实例引用作为弱引用持有。
其他相关的内容欢迎童鞋们评论补充哦~
资源对象没关闭。
如Cursor、File等资源。他们会在finalize中关闭,但这样效率太低。容易造成内存泄露。
SQLiteCursor,当数据量大的时候容易泄露
使用Adapter时,没有使用系统缓存的converView。
即时调用recycle()释放不再使用的Bitmap。
适当降低Bitmap的采样率,如:
BitmapFactory.Options options = newBitmapFactory.Options();
options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一
Bitmap bitmap =BitmapFactory.decodeStream(cr.openInputStream(uri), null, options); preview.setImageBitmap(bitmap);
使用application的context来替代activity相关的context,不要让生命周期长于Activity的对象持有到Activity的引用。尽量避免activity的context在自己的范围外被使用,这样会导致activity无法释放。
注册没取消造成内存泄露
如:广播
集合中的对象没清理造成的内存泄露我们通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。
Handler应该申明为静态对象, 并在其内部类中保存一个对外部类的弱引用。如下:
static class MyHandler extends Handler {
WeakReference<Activity > mActivityReference;
MyHandler(Activity activity){
mActivityReference= new WeakReference<Activity>(activity);
}
@Override
public void handleMessage(Message msg){
final Activity activity = mActivityReference.get();
if (activity != null){
mImageView.setImageBitmap(mBitmap);
}
}
}
尽量不要在Activity中使用非静态内部类,因为非静态内部类会隐式持有外部类实例的引用(具体可以查看细话Java:”失效”的private修饰符了解)。如果使用静态内部类,将外部实例引用作为弱引用持有。
其他相关的内容欢迎童鞋们评论补充哦~
相关文章推荐
- android内存泄露的原因
- Android中使用Handler造成内存泄露的原因和解决方法
- Android内存泄露分析之-内存泄露的原因
- android开发中内存泄露的原因
- Android内存泄露原因
- 【Android性能优化】内存泄露和内存溢出(OOM)的引发原因及优化方案
- 【Android性能优化】内存泄露和内存溢出(OOM)的引发原因及优化方案
- Android 内存泄露原因及使用MAT工具分析
- Android内存泄露的原因
- android 内存泄露产生原因分析
- android中JNI调用时内存分布以及内存泄露原因分析
- 【Android性能优化】内存泄露和内存溢出(OOM)的引发原因及优化方案
- android18——导致内存泄露的原因
- Android内存泄露原因分析与处理方案
- Android OOM:内存管理分析和内存泄露原因总结
- Android中引起内存泄露的原因分析
- android 内存泄露的8个原因
- Android内存泄露原因
- Android 内存泄露原因及使用MAT工具分析
- 【Android性能优化】内存泄露和内存溢出(OOM)的引发原因及优化方案