这段时间调试APP的时候,发现程序在加载了过多的bitmap后会崩溃。查看了日志,原来是发生了内存溢出(OOM)。第一次遇到这样的问题,那就慢慢排查吧。

内存优化可以参考胡凯大神的博客Android内存优化之OOM

内存泄漏的原因在Android 内存泄漏总结里介绍的很详细了,主要有以下几个方面

  • 集合类泄漏
  • 单例造成的内存泄漏
  • 匿名内部类/非静态内部类和异步线程
  • Handler 造成的内存泄漏
  • 尽量避免使用 static 成员变量
  • 避免 override finalize()
  • 资源未关闭造成的内存泄漏
  • 一些不良代码造成的内存压力

而内存泄露的分析工具,在这篇文章里也介绍了很多,比如MAT(Memory Analysis Tools)。但是最方便的还是LeakCanary

关于LeakCanary的使用方法,可以参考使用LeakCanary检测安卓中的内存泄漏(实战)。只需要在Gradle里集成,在application里初始化就行了。注意Gradle引用时是区分release和debug版本的。

集成后发现,原来是AsyncTask的不正确使用导致了内存泄漏,主要就是因为开发者文档里面用的就是用非静态内部类,这个非静态内部类会隐式地持有外部类的引用,如果其生命周期大于外部activity的生命周期,就有可能导致内存泄漏。

解决方法可以参考以下博客Android内存泄漏-AsyncTask的不正确使用Android内存泄露之ThreadAndroid性能优化之常见的内存泄漏。在内部内中,对外部的activity做一个弱引用,当然在Activity销毁时候也应该取消相应的任务AsyncTask::cancel(),避免任务在后台执行浪费资源.

Android内存泄漏原因的更多相关文章

  1. Android 内存泄漏原因

    Android 手机给应用分配的堆内存通常是8 M 左右, 如果内存处理不当很容易造成 OOM (OutOfMemoryError),OOM 主要由于一下这些原因引起的: 1.  数据库 Cursor ...

  2. Android内存泄漏的各种原因详解

    转自:http://mobile.51cto.com/abased-406286.htm 1.资源对象没关闭造成的内存泄漏 描述: 资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我 ...

  3. 【转】android 内存泄漏相关收藏博客。

    关于android内存泄漏的研究   博客建了几个月,都没有去写,一是因为当时换工作,然后又是新入职(你懂的,好好表现),比较忙:二是也因为自己没有写博客的习惯了.现在还算是比较稳定了,加上这个迭代基 ...

  4. 关于android内存泄漏的研究

    博客建了几个月,都没有去写,一是因为当时换工作,然后又是新入职(你懂的,好好表现),比较忙:二是也因为自己没有写博客的习惯了.现在还算是比较稳定了,加上这个迭代基本也快结束了,有点时间来写写博客.好了 ...

  5. Android 内存泄漏优化汇总

    android内存泄漏优化摘要 博客分类: android android内存溢出OutOfMemoryError . android移动应用程序的内存分配一般是8凯瑟琳约,不正确地假定处理内存处理非 ...

  6. Android内存泄漏检测利器:LeakCanary

    Android内存泄漏检测利器:LeakCanary MAR 28TH, 2016 是什么? 一言以蔽之:LeakCanary是一个傻瓜化并且可视化的内存泄露分析工具 为什么需要LeakCanary? ...

  7. Android 内存泄漏分析与解决方法

    在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...

  8. [Android]Android内存泄漏你所要知道的一切(翻译)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/7235616.html Android内存泄漏你所要知道的一切 ...

  9. Android内存泄漏的检测流程、捕捉以及分析

    https://blog.csdn.net/qq_20280683/article/details/77964208 Android内存泄漏的检测流程.捕捉以及分析 简述: 一个APP的性能,重度关乎 ...

随机推荐

  1. VS2017 远程调试linux(centos).net core

    第一步建立链接 Tools > Options > Cross Platform > Connection Manage 工具>选项>跨平台>连接管理器 第二步骤  ...

  2. ALGO-120_蓝桥杯_算法训练_学做菜

    问题描述 涛涛立志要做新好青年,他最近在学做菜.由于技术还很生疏,他只会用鸡蛋,西红柿,鸡丁,辣酱这四种原料来做菜,我们给这四种原料标上字母A,B,C,D. 涛涛现在会做的菜有五种: . 西红柿炒鸡蛋 ...

  3. python 引用计数

    转载:NeilLee(有修改)   一.概述 要保持追踪内存中的对象,Python使用了引用计数这一简单的技术. sys.getrefcount(a)可以查看a对象的引用计数,但是比正常计数大1,因为 ...

  4. Android开发之选项菜单(optinosMenu)

    android一共有三种形式的菜单:                  1.选项菜单(optinosMenu)                  2.上下文菜单(ContextMenu)       ...

  5. 阿里云ECS安装Kubernetes问题收集与解答

    问题1 kubernetes pod启动报错open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such fil ...

  6. OpenStack 创建虚机过程简要汇总

    1. 总体流程 翻译自原文(英文):https://ilearnstack.com/2013/04/26/request-flow-for-provisioning-instance-in-opens ...

  7. [转]Windows7:Visual Studio 2008试用版的评估期已经结束解决方法

    原文来自:http://blog.sina.com.cn/s/blog_6b1815080100y5z3.html     以前在Windows2003碰到这个问题时,都是到"控制面板→添加 ...

  8. 第一次软件工程作业——html制作一份简单的个人简历

    源码链接(码云):https://gitee.com/yongliuli/codes/eavjr7lxotb85s0icnq1z68 简历效果图展示: 代码展示: 添加背景音乐的方法: 在<he ...

  9. Jensen不等式

  10. JVM调优常用参数

    JVM常用参数配置 -Xmx2048m 最大堆大小 -Xms1024m 初始堆大小 -Xmn1024m 年轻代大小 -XX:SurvivorRatio=8 Eden区与Survivor区的大小比值,设 ...