一 、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的更多相关文章

  1. Android中解决图像解码导致的OOM问题

    Android中解决图像解码导致的OOM问题 原文链接:http://blog.csdn.net/zjl5211314/article/details/7042017

  2. Android 中加载几百张图片做帧动画防止 OOM 的解决方案

    Android 中加载几百张图片做帧动画防止 OOM 的解决方案 最近,项目中有个需求:就是要做一个帧动画,按理说这个是很简单的!但是我能说这个帧动画拥有几百张图片吗?...... 填坑一 ---帧动 ...

  3. Android中内存泄露与如何有效避免OOM总结

    一.关于OOM与内存泄露的概念 我们在Android开发过程中经常会遇到OOM的错误,这是因为我们在APP中没有考虑dalvik虚拟机内存消耗的问题. 1.什么是OOM OOM:即OutOfMemoe ...

  4. Android 中关于static的使用问题

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5251564.html 项目中,在不停地接收串口数据很长一段时间(几小时)后,会偶然性的报错.初步排除了oom ...

  5. Android中ListView的几种常见的优化方法

    Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapte ...

  6. Android中使用Handler造成内存泄露的分析和解决

    什么是内存泄露?Java使用有向图机制,通过GC自动检查内存中的对象(什么时候检查由虚拟机决定),如果GC发现一个或一组对象为不可到达状态,则将该对象从内存中回收.也就是说,一个对象不被任何引用所指向 ...

  7. Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片

    Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片 自定义ADPager 自定义水平滚动的ScrollView效仿ViewPager 当遇到要在Vie ...

  8. 系统剖析Android中的内存泄漏

    [转发]作为Android开发人员,我们或多或少都听说过内存泄漏.那么何为内存泄漏,Android中的内存泄漏又是什么样子的呢,本文将简单概括的进行一些总结. 关于内存泄露的定义,我可以理解成这样 没 ...

  9. 那些Android中的性能优化

    性能优化是一个大的范畴,如果有人问你在Android中如何做性能优化的,也许都不知道从哪开始说起. 首先要明白的是,为什么我们的App需要优化,最显而易见的时刻:用户say,什么狗屎,刷这么久都没反应 ...

随机推荐

  1. Android 进程常驻(使用第三方MarsDaemon)(虽然不可用,但是还是保留下。)

    github地址: https://github.com/Marswin/MarsDaemon 原理分析: Android 进程常驻(0)----MarsDaemon使用说明 Android 进程常驻 ...

  2. JS:event对象下的target属性和取消冒泡事件

    1.target 通过获取DOM元素 var box = document.getElementById("box"); document.box.onclick = functi ...

  3. CSS3实现开门动画

    <!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8&qu ...

  4. Mac下各种网络命令的使用

    Mac下各种网络命令的使用(http://blog.51yip.com/linux/745.html) pingwww.baidu.com 会一直ping下去,和windows不一样, windows ...

  5. 如何用最简单的方法将PCweb改成适合各种设备的web

    使web页面自适应设备大小 1)用一个<div>包围<body>的内容 2)该div属性的宽度设为100%   (宽度设为100%后,页面会随着设备窗口大小自动改变) 3)高度 ...

  6. tomcat配置https

    1.开启使用https协议 编辑tomcat目录下的conf/server.xml文件 <Connector port="443" protocol="HTTP/1 ...

  7. 无聊拆中国银行密码器和农业银行U盾

    原始状态 不知从何下手,直接斜口钳暴力剪开 开始露出电路板了,继续拆 拆完是这样的,屏幕没有焊接,直接靠外壳压上去的 背面图 相对而言,农行的就很好拆 后盖很好撬开 前面就是按键,没什么,屏是1286 ...

  8. 【7集iCore3基础视频】7-6 Quartus II 13.1安装

    Quartus II 13.1安装:高清源视频:链接:http://pan.baidu.com/s/1csVRMA 密码:lkth 视频勘误:http://pan.baidu.com/s/1mhCIq ...

  9. Xamarin Android 绑定jar库同时将so库打包进去

    1.在创建的Bindings Library项目中,新建Assets目录: 2.Assets目录下再分别创建armeabi,armeabi-v7a,x86三个目录: 3.将so文件分布copy到三个目 ...

  10. 雷克萨斯-RC

    -型号:RC(双门) -价格:49-59W -动力:2T -变速箱:8挡手自一体 -长宽高:4.70,1.84,1.40 -油箱:66L -发动机:8AR-FTS -大灯:LED