总结Android中遇见的OOM
一 、Android应用中内存泄漏几种的原因:
1.单例模式导致的内存泄漏:
当调用getInstance时,如果传入的context是Activity的context。只要这个单例没有被释放,这个Activity的引用就不会被释放,从而导致OOM。
解决方法:
传入Application的context,因为Application的context和getInstance中的静态变量生命周期一样长,不会造 成当Activity销毁不掉。
2.内部类导致的内存泄漏:
我们在使用Thread或者广播接收器的时候经常会直接new Thread(),new MyBroadcastReceiver(),还有我们经常写的Handler都这样写都会造成内存泄漏。原因是我们这样写相当于创建了一个匿名内部类, 而内部类会隐士的持有一个外部类的引用不会释放,当Activity进行销毁的时候,就不会销毁,导致堆中存放着很多个Acitivity的引 用,又不会被GC掉。
解决办法:在Activity销毁时,尽可能将Acitivity的内部类引用进行销毁,注册广播的要及时的进行销毁,使用Handler的地方remove掉所有的Message 或者可以将内部类声明为静态类。但是将内部类声名为静态类后由于静态类不再持有外部类对象的引用,导致程序不允许内部类中操作 Activity中的对象了。所以需要在外部类中增加一个对Activity的弱引用(WeakReference),在创建内部类对象的时候将 Activity的引用传进去使用。
下面是以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) {
mActivityReference.mImageView.setImageBitmap(mBitmap);
}
}
}
3.资源对象没关闭造成内存泄露
比如Cursor,File文件等我们在不使用的时候,应该及时关闭它们。否则多也会造成内存泄漏。
二、调试OOM的方法:
1.代码中添加严格模式。在程序运行时会将程序中潜在的危险信息以错误的形式打印出来。方法如下:
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectAll()
.penaltyLog()
.build());
2.打印程序中每个对象的使用情况,进行分析内存泄露的原因。可以通过下面的命令将dump出堆中内存的使用情况,再Analyzer软件进行分析。
adb shell am dumpheap 程序的包名 /data/local/tmp/6.hprof
adb pull /data/local/tmp/6.hprof .
hprof-conv 6.hprof 6c.hprof
3.通过观察logcat中dalvikvm中GC的打印,如:
D/dalvikvm( 480): GC_CONCURRENT freed 1161K, 24% free 12700K/16568K, paused 6ms+6ms, total 60ms
如果内存回收打印情况一直在增多,则说明存在内存泄露。
4.通过adb shell 中的showmap观察内存的使用情况,看是否存在内存泄露。
总结Android中遇见的OOM的更多相关文章
- Android中解决图像解码导致的OOM问题
Android中解决图像解码导致的OOM问题 原文链接:http://blog.csdn.net/zjl5211314/article/details/7042017
- Android 中加载几百张图片做帧动画防止 OOM 的解决方案
Android 中加载几百张图片做帧动画防止 OOM 的解决方案 最近,项目中有个需求:就是要做一个帧动画,按理说这个是很简单的!但是我能说这个帧动画拥有几百张图片吗?...... 填坑一 ---帧动 ...
- Android中内存泄露与如何有效避免OOM总结
一.关于OOM与内存泄露的概念 我们在Android开发过程中经常会遇到OOM的错误,这是因为我们在APP中没有考虑dalvik虚拟机内存消耗的问题. 1.什么是OOM OOM:即OutOfMemoe ...
- Android 中关于static的使用问题
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5251564.html 项目中,在不停地接收串口数据很长一段时间(几小时)后,会偶然性的报错.初步排除了oom ...
- Android中ListView的几种常见的优化方法
Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapte ...
- Android中使用Handler造成内存泄露的分析和解决
什么是内存泄露?Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收.也就是说,一个对象不被任何引用所指向 ...
- Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片
Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片 自定义ADPager 自定义水平滚动的ScrollView效仿ViewPager 当遇到要在Vie ...
- 系统剖析Android中的内存泄漏
[转发]作为Android开发人员,我们或多或少都听说过内存泄漏.那么何为内存泄漏,Android中的内存泄漏又是什么样子的呢,本文将简单概括的进行一些总结. 关于内存泄露的定义,我可以理解成这样 没 ...
- 那些Android中的性能优化
性能优化是一个大的范畴,如果有人问你在Android中如何做性能优化的,也许都不知道从哪开始说起. 首先要明白的是,为什么我们的App需要优化,最显而易见的时刻:用户say,什么狗屎,刷这么久都没反应 ...
随机推荐
- 【BZOJ】3437: 小P的牧场
题意 n个点,需要再一些点建立控制站,如果在第\(i\)个建站,贡献为\(a[i]\).假设前一个站为\(j<i\),则\([j+1, i]\)的点的贡献是\(\sum_{k=j+1}^{i} ...
- 【CodeVS2800】 送外卖 最短路+状压DP
首先求出各点之间的最短路,floyed即可,注意是0-n. 然后考虑状压,f[i][j]表示状态为i时访问j点时的最短路和,1表示访问,0表示未访问,然后第j个点所在的位置就是(1<<j) ...
- ZeroMQ接口函数之 :zmq_msg_send – 从一个socket发送一个消息帧
ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_msg_send zmq_msg_send(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_ ...
- C#中xml操作
序列化成一个字符串: public static string XMLSerialize<T>(T entity) { StringBuilder buffer = new StringB ...
- mongoVUE的增删改查操作使用说明
mongoVUE的增删改查操作使用说明 一. 查询 1. 精确查询 1)右键点击集合名,再左键点击Find 或者直接点击工具栏上的Find 2)查询界面,包括四个区域 {Find}区,查询条件格式{& ...
- 分部方法 partial
当有如下这样类似的情况出现的时候,可以有更好的优化方式来处理,那就是分部方法 class PartOld { string name; public virtual void OnChangeName ...
- /etc/sudoers文件损坏修复
1. 重启(开机)时按Shift键(这时就会进入grub模式) 选择第二项 进入高级选项
- 一起来做webgame,《Javascript蜘蛛纸牌》
不得不说,做游戏是会上瘾的,这次带来的是win系统上的经典游戏<蜘蛛纸牌>,不能完美,但求一玩 移牌 0 次 Javascript game_蜘蛛纸牌 正在努力加载... // " ...
- Spring IoC容器初始化过程学习
IoC容器是什么?IoC文英全称Inversion of Control,即控制反转,我么可以这么理解IoC容器: 把某些业务对象的的控制权交给一个平台或者框架来同一管理,这个同一管理的平台可以称为I ...
- iphone状态栏高度?
设备分辨率 状态栏高度 导航栏高度 标签栏高度 iPhone6 plus 1242×2208 px 60px ...