android什么会造成内存泄露

 我来答
彩色的沙漠2011
2016-09-27 · TA获得超过116个赞
知道小有建树答主
回答量:186
采纳率:0%
帮助的人:55.2万
展开全部

没人喜欢OutOfMemoryError

在Square的注册过程中,我们在bitmap上 绘制了一个用户的签名。这个bitmap和设备的屏幕大小相当,在创建它的时候,我遇到了相当数量的OOM导致的崩溃。

我们试过了几种方法,没有一个解决了我们的问题:

使用Bitmap.Config.ALPHA_8(签名是不需要颜色的)

捕获OutOfMemoryError,触发垃圾回收然后重试几次(从GCUtils 获得的启发)

我们没有考虑过将bitmap分配在堆内存之外,那个时候Fresco 还没出现。

我们看待问题的方式是不对的

bitmap的大小本身不是什么问题。当内存快要满了的时候,OOM随时随地都可能发生。尤其是在创建大对象的时候更容易发生,比如bitmap。OOM一般代表着更深层次的问题:内存泄漏。

什么是内存泄漏?

有些对象只有有限的生命周期。当它们的任务完成之后,它们将被垃圾回收。如果在对象的生命周期本该结束的时候,这个对象还被一系列的引用,这就会导致内存泄漏。随着泄漏的累积,app将消耗完内存。

比如,在Activity.onDestroy()被调用之后,view树以及相关的bitmap都应该被垃圾回收。如果一个正在运行的后台线程继续持有这个Activity的引用,那么相关的内存将不会被回收,这最终将导致OutOfMemoryError崩溃。

寻找内存泄漏

寻找内存泄漏是一个人工操作的过程,在Raizlabs的 Wrangling Dalvik 系列中描述得很清楚。

下面是关键的步骤:

通过 Bugsnag, Crashlytics, 或者 Developer Console了解OOM

主动重现问题。你可能需要买或者借或者偷一个遭遇了崩溃的特殊设备(并不是所有的设备上都会发生内存泄漏!)。你还需要找出是什么串在一起导致了内存泄漏。

当OOM出现时进行堆转储(dump the heap)(这里介绍了如何做).

使用MAT或YourKit内存检测工具检测内存的变化,并找出哪个对象应该被垃圾回收;

从那个对象到GC roots推断最短的强引用路径;

在路径中找出不存在的引用,并修复memory leak;

要是有一个库可以为你做完所有的事情,让你专注于修复内存泄漏的问题,那该有多好。

LeakCanary介绍

LeakCanary 是一个开源的在debug版本中检测内存泄漏的java库。

让我们来看看一个cait的例子:


class Cat {

}

class Box {

  Cat hiddenCat;

}

class Docker {

  static Box container;

}

 

// ...

 

Box box = new Box();

Cat schrodingerCat = new Cat();

box.hiddenCat = schrodingerCat;

Docker.container = box;

创建一个RefWatcher实例,然后给它一个对象让它观察:


// We expect schrodingerCat to be gone soon (or not), let's watch it.

refWatcher.watch(schrodingerCat);

当检测出泄漏的时候,你会自动得到一个漂亮的泄漏线索:


* GC ROOT static Docker.container

* references Box.hiddenCat

* leaks Cat instance

我们知道你的时间宝贵,因此我们让它非常好设置。只需几行代码,LeakCanary就能自动检测Activity的泄漏:


public class ExampleApplication extends Application {

  @Override public void onCreate() {

    super.onCreate();

    LeakCanary.install(this);

  }

}

当内存不足时,会有一个通知和良好的展示界面:

结论

在启用LeakCanary之后,我们发现和修复了许多内存泄漏的问题。我们甚至发现了一些 Android SDK中的泄漏。

结果是非常令人惊奇的,我们现在减少了94%的oom崩溃问题。

如果你想终结OOM崩溃,现在就安装LeakCanary! 

ml014789
2016-09-27 · TA获得超过1346个赞
知道小有建树答主
回答量:2347
采纳率:37%
帮助的人:739万
展开全部
android 不会啊?你这话说的有问题吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式