又是好久没有写博客了,一直都比较忙,最近终于有时间沉淀和整理一下最近学到和解决的一些问题。

最近进行技术支持的时候,遇到了几个崩溃的问题,都是OOM异常,一般OOM异常给人的感觉应该是加载大图片造成的,但是经过看界面布局,并且分析加载图片的大小发现加载图片方面已经没有什么可以优化的了,但是依然崩溃,没办法了,又用的IDEA工具中的内存监视器,来判断到底是哪里造成内存激增,做哪些操作造成页面资源没有及时释放。最后发现原来是每次关闭这个界面,都没有及时的释放资源,每次开启,都会重新申请资源,造成内存泄露问题。下面我就说一下我们写代码的时候,那些地方容易会造成内存泄露。

首先是在Activity中声明静态变量或者静态方法或者静态控件

静态变量或者方法是放在静态数据区的,也就是在程序运行的过程中,只要加载过这个类之后,静态的变量或者方法,就一直会在静态数据区存在,不会释放资源。因为静态变量或者方法不是凭空存在的,所以需要Activity作为支撑,也就是说这个变量不仅占用了变量本身所存放数据的内存,还占据了这个Activity所占的内存。也就是这个Activity即使被用户关闭了,但是资源并没有被释放。

其次,一些读取数据库动态注册广播没有及时关闭注销也是容易造成内存泄露的

例如例如BroadcastReceiver、ContentObserver,FileObserver在Activity的onDeatory或者某类的生命周期结束后,一定要unregister掉,否则这个Activity会一直被system强引用,不会被内存回收。

单例模式导致的内存泄露,

单例模式的特点就是他的生命周期和Application一样,如果某个Activity示例被一个单利所持有,也就是说单利里面引用了他,就会造成Activity对象会无法正常回收释放。

注:这里的原理和第一种是一样的,都是因为静态变量引用Activity对象,造成Activity无法正常释放资源造成的。

属性动画导致内存泄露

例如代码中设置了属性动画(ObjectAnimator),在Activity中启动了动画,但是在销毁的时候,没有调用cancle方法,虽然我们看不到动画了,但是这个动画依然会不断地播放下去,动画引用所在的控件,所在的控件引用Activity,这就造成Activity无法正常释放。

Handler内部类造成内存泄露

当使用内部类(包括匿名内部类)来创建Handler的时候,Handler对象会隐式的持有一个外部类对象(通常是Activity)的引用,而handler通常会伴随这一个耗时的后台线程(例如从网络拉取图片)一起出现,这个后台线程在任务执行完毕之后,通过消息机制,通知Handler然后Handler见图片更新到界面,如果用户在网络请求中关闭了Activity,正常情况下,Activity不再被使用,因该会被Gc回收掉,但是,由于该线程未执行完,而该线程持有的Handler的引用,就导致Activity无法被回收(直到网络请求结束),如果你执行了Handler的postDelayed()方法,该方法会将你的Handler装入一个Message,并把这条Message推到MessageQueue中,那么在你设定的delay到达之前,会有一条MessageQueue -> Message -> Handler -> Activity的链,导致你的Activity被持有引用而无法被回收。可以在Activity结束后,关闭线程,如果你的Handler是被delay的Message持有了引用,那么调用void removeCallbacksAndMessages(null)方法来移除消息队列。

Android性能优化——之防止内存泄露的更多相关文章

  1. Android 性能优化 - 详解内存优化的来龙去脉

    前言 APP内存的使用,是评价一款应用性能高低的一个重要指标.虽然现在智能手机的内存越来越大,但是一个好的应用应该将效率发挥到极致,精益求精. 这一篇中我们将着重介绍Android的内存优化.本文的篇 ...

  2. Android性能优化之避免内存泄漏的建议

    在android程序开发中,内存泄漏问题是比较常见的问题,相信有过一些android编程经历的程序猿都遇到过各种各样的内存泄漏.内存泄漏是造成应用程序OOM的主要原因之一,是编程中必须避免的问题.下面 ...

  3. Android性能优化系列之App启动优化

    Android性能优化系列之布局优化 Android性能优化系列之内存优化 Android性能优化系列之apk瘦身 应用的启动速度缓慢是我们在开发过程中常常会遇到的问题,比方启动缓慢导致的黑屏.白屏问 ...

  4. Android性能优化系列之apk瘦身

    Android性能优化系列之布局优化 Android性能优化系列之内存优化 为什么APK要瘦身.APK越大,在下载安装过程中.他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率 ...

  5. Android性能优化:手把手带你全面了解 内存泄露 & 解决方案

    . 简介 即 ML (Memory Leak)指 程序在申请内存后,当该内存不需再使用 但 却无法被释放 & 归还给 程序的现象2. 对应用程序的影响 容易使得应用程序发生内存溢出,即 OOM ...

  6. Android性能优化:手把手带你全面实现内存优化

      前言 在 Android开发中,性能优化策略十分重要 本文主要讲解性能优化中的内存优化,希望你们会喜欢 目录   1. 定义 优化处理 应用程序的内存使用.空间占用 2. 作用 避免因不正确使用内 ...

  7. Android 性能优化之内存泄漏检测以及内存优化(中)

    https://blog.csdn.net/self_study/article/details/66969064 上篇博客我们写到了 Java/Android 内存的分配以及相关 GC 的详细分析, ...

  8. [Android 性能优化系列]内存之基础篇--Android怎样管理内存

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...

  9. 老李分享:Android性能优化之内存泄漏1

    老李分享:Android性能优化之内存泄漏   前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想检测程序中是否有内存泄漏的产生,通常我 ...

随机推荐

  1. 交互神器 Facebook Origami

    最近用到了一个非常强大的工具,这是一款由 facebook 出品的原型设计软件,老规矩我们先来看一下效果.大家也可以先进去官网看看效果Origami 官网 scroll.gif swipe.gif O ...

  2. 1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区(题解第一弹)

    1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit:  ...

  3. 3360: [Usaco2004 Jan]算二十四

    3360: [Usaco2004 Jan]算二十四 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6  Solved: 6[Submit][Statu ...

  4. HTML+CSS-淘宝网页

    <html> <head> <meta http-equiv="Content-Type" content="text/html;chars ...

  5. jmeter的http cookies管理器使用

    关于Cookie不过多介绍,测试UI的小伙伴们应该对此有深深的爱和恨~ 本文介绍如何:1.获取Cookie.2.保存Cookie 3.引用Cookie 最终达到Cookie类似无法失效的目的~ Coo ...

  6. 通过Map间接比较两个Json格式是否相同

    首先,我们举个例子来对两个Json格式进行比较 第一个Json格式: {"singleway":[],"multiway":{"channelSlav ...

  7. web从入门开始(6)-----框架

    普通框架 框架概念:就是将一个页面分割成小窗口,每个窗口都是一个网页 框架集和框架页 框架集:<frameset>:主要用来划分窗口的 框架页:<frame>:主要用来指定窗口 ...

  8. vue搭建开发环境

    windows下搭建vue开发环境 一.安装node.js 安装   vue项目通常通过webpack工具来构建,而webpack命令的执行是依赖node.js环境,所以首先要安装node.js. n ...

  9. Angular2发布思路(整理官网Deployment页面)

    本文是按着ng2官网的高级内容“Deployment”的思路整理得出的,原文虽然在angular2的中文站下挂着,截止目前却还是英文版未翻译,笔者就在这里结合自己的理解给出原文的一点点整理.这是原文地 ...

  10. C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(下)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(下)),不对的地方欢迎指出与交流. 章节出自<Professional C# ...