`

Android 内存泄露

阅读更多

android application被限制到16M堆内存。

越多的application保存在内存中,那么在他们之间切换的时候,速度就会更快。

a  Context   能被在很多方面应用,但是最多的是加载访问资源,这就是为啥widget接受一个a  Context   参数在构造函数里。

在一个规则的application中,你通常用俩中Context,activity和application。

当屏幕方向转变时,默认摧毁当前的activity 创建一个新的,android将重新加载application的ui。

如果你有一个大的bitmap你不想每次转变屏幕时都加载,如果你用一个static去总是保持它

private   static   Drawable   sBackground   ;

@Override

protected   void   onCreate   (   Bundle   state   )

{      super   .   onCreate   (   state   );    

TextView   label  =   new   TextView   (   this   );    

label   .   setText   (   "Leaks are bad"   );    

if   (   sBackground  ==   null   )   {      

sBackground  =   getDrawable   (   R   .   drawable   .   large_bitmap   );

   }    

label   .   setBackgroundDrawable   (   sBackground   );    

setContentView   (   label   );   }

代码很快,但是也很错。他泄露了这第一个activity,当一个drawable被   attached to a view,这个VIEW被设置作为一个callback在这个drawable,在上述代码中,这意味着这个drawable有一个引用在 textview,而这个textview本身有一个引用在这个activity上,而这个activity依次有许多他自身的引用。你可以参看home screen源代码通过设置drawble的callback为空当activity被摧毁时。

/** * Remove the callback for the cached drawables or we leak the previous* Home screen on orientation change. */

  private void unbindDrawables(ArrayList<ItemInfo> desktopItems) {

        if (desktopItems != null) {

            final int count = desktopItems.size();

            for (int i = 0; i < count; i++) {

                ItemInfo item = desktopItems.get(i);

                switch (item.itemType) {

                case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:

                case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:

                    ((ApplicationInfo)item).icon.setCallback(null);

                    break;

                }

            }

        }

    }

俩中避免与context相关联的内存泄露。The most obvious one is to avoid escaping the context outside of its own scope.

上述例子展示了一个静态引用的例子。但是内部类和他们的隐士的外部引用能是同样危险的。

这第二个解答是用application context。这个context将活着和你的application一样长,并不依赖这activity的生命周期。

如果你计划保持长引用的对象,他需要一个context,记者用application的。通过Context.getApplicationContext()



or Activity.getApplication()



  • 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

FAQ:

1.If Drawable just a member field and not static - it’s fine right?

An instance variable will not cause any problem indeed.

2.public void setBackgroundDrawable(Drawable d) {

if (d != null) {

d.setCallback(this);

}

}

从这个代码看出,上述例子里the setBackgroundDrawable reset the drawable’s callback after the activity reloaded.

when the setBackgroundDrawable() is called, the Drawable has setCallback() invoked, which will overwrite the current callback, therefore no memory leak?

  1. Romain Guy

    Justin,

    If you always set it on a View, then it’s not an issue (well, except that you kept a hold onto the previous Context for longer than needed.) It can become very problematic for an application in which you use the drawables in a ListView for instance: as long as the drawable is not re-bound to a View, you keep the old Context and all the resources and Views. It’s much safer to not rely on that at all.

  2. 上述说了你不可能总是记者re-bound到一个VIEW上,一旦你忘了,就会泄露。
  3. 14   Romain Guy

    There’s also the situation of when your Activity is destroyed but not recreated (it can happen for several reasons.) If the process is still there, your static fields also are and you are leaking the Activity until it is recreated.

  4. 这段话说了如果你的activity被摧毁但是没被创建,如果你的进程仍旧在哪,你的静态字段也在哪,那么你正在泄露。

分享到:
评论

相关推荐

    Android内存泄漏简介

    以下是几个导致Android内存泄漏的主要因素及其相关知识点。 1. 引用没有释放造成的内存泄漏 在Android开发中,如果不正确地管理对象引用,可能会导致内存泄漏。例如,如果一个Activity持有某个服务、广播接收器或...

    Android 内存泄露 Mat工具分析

    本文将详细介绍如何使用 MAT 分析 Android 应用程序中的内存泄露,特别是如何根据 heap dump 分析泄漏根源。 ClassLoader 和 Java 类加载机制 在介绍 MAT 之前,需要了解 Java 类加载机制。ClassLoader 是 Java 中...

    Android 内存泄露原因分析

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

    android内存泄露的检测和排查

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

    android内存泄露测试

    ### Android内存泄露测试详解 在Android开发中,内存管理是一项至关重要的任务,不当的内存管理会导致应用运行缓慢、崩溃甚至耗尽系统资源。内存泄露是内存管理中的一个常见问题,它指的是应用程序分配了内存但未能...

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

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

    android内存泄露

    本文将深入探讨Android内存泄露的概念、原因、检测方法以及如何进行有效修复。 首先,我们要理解什么是内存泄露。内存泄露是指程序在申请内存后,无法释放已不再使用的内存空间。在Android系统中,由于Java的自动...

    android 内存泄露 分析方法

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

    mac_mat android内存泄漏分析工具

    "mac_mat android内存泄漏分析工具"就是这样一个针对Android平台的工具,特别适合在Mac环境下对应用进行内存泄漏检测。 MAT(Memory Analyzer Tool)是由Eclipse基金会开发的一个强大的Java内存分析工具。尽管主要...

    Android 内存泄漏调试经验分享

    ### Android内存泄漏调试经验分享 #### 一、概述 在Android开发中,内存泄漏是一个常见且需要重点关注的问题。由于Android设备通常配置有限,尤其是内存资源较为紧张,因此开发者需要格外注意避免内存泄漏的发生,...

    Android内存泄漏详解专栏

    ### Android内存泄漏详解 #### 一、什么是内存泄漏? 内存泄漏是指程序中已分配的内存未得到及时释放或无法释放,导致系统中的可用内存逐渐减少,最终可能导致应用程序或整个系统运行缓慢甚至崩溃。 #### 二、...

    Android内存泄漏调试教程

    ### Android内存泄漏调试知识点 #### 一、概述与重要性 在Android开发中,内存管理是确保应用性能和稳定性的重要方面。由于Android设备通常配备有限的内存资源,不当的内存管理会导致应用运行缓慢甚至崩溃。文章...

    Android内存泄漏解决方案

    ### Android内存泄漏解决方案 #### 一、概述 在Android应用开发过程中,内存管理是一个非常重要的环节。不当的内存管理不仅会导致应用性能下降,甚至可能导致应用崩溃。为了有效地管理和避免内存泄漏,开发者需要...

    android 内存泄漏 摘抄

    ### Android内存泄漏详解 #### 一、资源对象未关闭导致的内存泄漏 在Android开发过程中,内存泄漏是一个常见的问题,特别是在资源对象管理方面。资源对象如`Cursor`、文件流等,通常会在内部使用缓冲机制来提高...

    Android内存泄漏.doc

    本文主要探讨了Android内存管理机制、内存泄漏的原因以及如何进行内存泄漏的测试。 首先,Android的内存机制基于Java,因此采用的是垃圾回收(Garbage Collection, GC)策略。在Java中,内存分配通过`new`关键字...

    Android内存泄漏的八种可能.pdf

    Android 内存泄漏的八种可能 Android 内存泄漏是指在 Android 应用程序中由于编程错误或设计缺陷导致的内存不被释放,占用系统资源的问题。这种问题可能会导致应用程序崩溃、性能下降、甚至系统崩溃。 在 Java 中...

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

    以上知识点涉及了Android内存泄漏分析的多个方面,包括理论知识、工具使用、操作实践和问题诊断技巧。理解和掌握这些知识点对Android开发人员来说是非常重要的,它可以帮助他们在日常开发中有效地避免和解决内存泄漏...

    Android内存泄露检测_mat

    以下将详细介绍如何使用MAT进行Android内存泄露的检测。 **安装MAT** MAT可以作为独立的应用程序运行,也可以作为Eclipse IDE的插件。下载MAT的相应版本(例如MemoryAnalyzer-1.1.1.20110824-linux.gtk.x86_64.zip...

    Android 内存泄漏

    自己收集的android方面关于内存泄漏方面的视频以及学习资料,自己之前花钱搞到的,现在对外公开。文档里面是链接和密码,永久有效!

    Android内存泄漏总结1

    Android内存泄漏是开发者必须关注的重要问题,因为它直接影响到应用的性能和用户体验。内存泄漏指的是本应被释放的对象由于某种原因仍然被持有,导致垃圾收集器(GC)无法回收这些资源,从而占用宝贵的内存空间。本文...

Global site tag (gtag.js) - Google Analytics