`

一个常见的android内存泄露 问题

阅读更多

 

  最近在公司看一个算比较大的android项目的源码,发现了一个很严重的问题,就是项目里使用单例模式,构造函数要传入Context做参数的类,基本上都存在内存泄露问题。我想这个项目这么多人做也没有人发现问题,这问题应该会挺常见的,同时也挺严重的。

       存在内存泄露问题的一些代码片段像下面这样:

Util.java

 

public class Util {

 

    private Context mContext;

  private static Util sInstance;

    

    private Util(Context context) {

        this.mContext = context;

    }

    

    public static Util getInstance(Context context) {

        if (sInstance == null) {

            sInstance = new Util(context);

        }

        return sInstance;

    }

    

    //other methods

}

 

假设Activity  A 里使用Util类:

Util.getInstance(this);

 

代码大意就是这样,这样写的问题就是,在Activity A 里使用Util类,传入的context 是 actvitiy-context。试想一下,当Activity A 生命周期结束,但Util类里面却还存在A的引用 (mContext),这样Activity A占用的内存就一直不能回收,而A的对象也不会再被使用。本人写代码测试过,在A中调用了finish(),A的destroy()方法也被执行了,但其占用的内存,比如说,ImageView占用的内存,还是不能释放的。有兴趣的话,可以自己测试一下。

 

那么如何解决这个问题呢?在A中,可以用Util.getInstance(getApplicationContext()); 或Util.getInstance(getApplication()); 代替。

 

因为Application的生命周期是贯穿整个程序的,所以Util类持有它的引用,也不会造成内存泄露问题。

其实这个问题android官方文档的Resources目录下的一篇题为

Avoiding Memory Leaks

的文章已经提到过。

 

可以自己去了解具体。

 

 

In summary, to avoid context-related memory leaks, remember the following:

  • Do not keep long-lived references to a context-activity (a reference to an activity should have the same life cycle as the activity itself)
  • Try using the context-application instead of a context-activity
  • Avoid non-static inner classes in an activity if you don't control their life cycle, use a static inner class and make a weak reference to the activity inside. The solution to this issue is to use a static inner class with a  to the outer class, as done in  and its W inner class for instance
  • A garbage collector is not an insurance against memory leaks

 

 

 

分享到:
评论
1 楼 小猫咪201 2014-05-23  
困惑了很久,终于找到答案了

相关推荐

    Android内存泄漏简介

    例如,如果一个Activity持有某个服务、广播接收器或其他组件的长期引用,而这些组件又持有了大量的资源,当Activity不再需要时,这些资源也不会被垃圾回收器回收,从而造成内存泄漏。开发者应该遵循最佳实践,例如...

    Android webview 内存泄露的解决方法

    Android webview 内存泄露的解决方法 最近在activity嵌套webview显示大量图文发现APP内存一直在涨,没法释放内存,查了很多资料,大概是webview的一个BUG,引用了activity导致内存泄漏,所以就尝试传递...

    Android处理内存泄漏的代码例子

    在Android开发中,内存泄漏是一个严重的问题,它会导致应用程序占用过多内存,影响性能甚至导致应用崩溃。本示例代码着重展示了如何避免Android应用中的内存泄漏,主要包括五个关键方面:关闭游标、重用适配器、回收...

    使用Android Studio检测内存泄露(LeakCanary)

    内存泄露在Android开发中是一个非常重要的问题,因为它可能导致应用程序运行缓慢、消耗过多资源甚至崩溃。Android Studio提供了多种工具帮助开发者检测和解决内存泄露,其中包括Memory Profiler和LeakCanary。 ...

    Android 内存泄露 Mat工具分析

    Android 内存泄露是一个常见的问题,它会导致应用程序的性能下降,甚至崩溃。Memory Analyzer Tool(MAT)是一个功能强大且广泛使用的内存泄露分析工具。本文将详细介绍如何使用 MAT 分析 Android 应用程序中的内存...

    Android Native 内存泄漏系统化解决方案

    高德地图采用线程本地存储(TLS),TLS 是一个专用存储区域,只能由自己线程访问,同时不存在线程安全问题,符合这里的场景。具体实现如下: * 利用编译器的 -finstrument-functions 编译选项在编译阶段插入相关...

    android内存泄露测试

    内存泄露是内存管理中的一个常见问题,它指的是应用程序分配了内存但未能释放,导致这部分内存无法被回收,长期累积将严重影响应用性能。本文将基于给定的信息,深入探讨Android内存泄露测试的关键知识点。 #### 一...

    Android解决大量帧动画内存泄漏问题

    帧动画太多造成内存泄漏问题,内含所需的JAR包:org.apache.commons.io.IOUtils,将Inputstream转为byte字节数组,减少内存泄漏 和关键代码,仅供参考,如有建议请在下方留言或添加咨询~~~

    android系统分析内存泄露测试

    在Android系统中,内存泄漏是一个严重的问题,它会导致应用程序占用过多的内存,进而影响设备性能,甚至可能导致应用崩溃。理解并有效地分析内存泄漏是每个Android开发者必须掌握的关键技能。 内存泄漏通常发生在...

    android内存泄露的检测和排查

    本文将深入探讨Android内存泄漏的检测和排查方法,并通过一个锁屏内存泄漏的例子进行具体分析。 首先,我们需要理解什么是内存泄漏。在计算机科学中,内存泄漏是指程序在申请内存后,无法释放已不再使用的内存空间...

    androidStudio内存泄漏分析

    在Android应用开发中,内存泄漏是一个严重的问题,它可能导致应用性能下降、响应变慢甚至崩溃。Android Studio作为官方推荐的集成开发环境(IDE),提供了强大的内存泄漏检测工具,帮助开发者定位并解决这些问题。...

    Android应用程序内存泄漏的分析.pdf

    内存泄漏是Android开发中非常常见且棘手的问题,它发生在一个对象不再被使用时,该对象所占用的内存没有被系统回收,长时间累积后可能导致应用程序性能下降或崩溃。 描述中重复强调了文档的标题,但没有提供额外的...

    Android 内存泄露原因分析

    Android 内存泄露原因分析。通过原因分析,再接合代码可查明具体原因,发现对策

    Node.js-Androidnative层代码内存泄漏问题调试利器

    在Android应用开发中,尤其是涉及到Native层代码时,内存泄漏是一个常见的问题,它可能导致应用程序运行缓慢,甚至崩溃。本文将详细介绍如何使用Node.js配合特定工具,有效地定位和解决Android Native层的内存泄漏...

    android 内存泄露 分析方法

    Android 内存泄露是一个非常常见的问题,它可能会导致应用程序崩溃或性能下降。了解内存泄露的原理和分析方法是非常重要的。 在本文中,我们将介绍使用 Memory Analyzer Tool(MAT)来分析内存泄露的方法。MAT 是一...

    android性能优化之内存泄露

    ### Android性能优化之内存泄露 ...综上所述,内存泄露是Android应用开发中一个不容忽视的问题。通过对常见内存泄露类型的了解和采取适当的预防措施,我们可以有效地提高应用程序的稳定性和性能。

    Android 内存泄漏调试经验分享

    在Android开发中,内存泄漏是一个常见且需要重点关注的问题。由于Android设备通常配置有限,尤其是内存资源较为紧张,因此开发者需要格外注意避免内存泄漏的发生,以确保应用程序能够高效稳定地运行。 #### 二、...

    Android 内存溢出问题

    本篇文章将深入探讨Android内存管理的两个核心概念:堆(Heap)和栈(Stack),以及如何理解和解决Android内存溢出问题。 1. 堆与栈 堆和栈是Java虚拟机(JVM)中的两种主要内存区域,它们各自具有特定的用途和...

    Android App定位和规避内存泄露方法研究

    总结来说,Android应用内存泄露是一个复杂的问题,涉及到Android内存管理机制、应用设计和代码实现等多个方面。通过上述方法,我们可以有效地检测、定位和规避内存泄露问题,从而提升Android应用的性能和稳定性。

    Android内存优化——常见内存泄露及优化方案

    本文将深入探讨Android系统中的常见内存泄露问题及其优化方案,主要针对Java编程语言。 一、内存泄露的理解与类型 内存泄露是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄露可能看似无关痛痒,...

Global site tag (gtag.js) - Google Analytics