24

我在我的 android 应用程序中遇到了一些内存泄漏。我已经使用MAT来分析内存使用情况。但是我从 Eclipse 中的 DDMS 角度提出了一个问题,1-byte array[byte[], boolean[]) 是什么意思?

在此处输入图像描述

这是否特定于我的应用程序?你可以看到这是大内存泄漏的问题,这个大小总是增加,其余的会随机增加和减少。我的猜测是 GC 没有捕捉到这种类型。任何人都可以解释为什么会发生这种情况,只有这么少的信息?

4

3 回答 3

10

一个字节数组是对组织为单字节数组的任何数据结构的名称。在你的情况和那个尺寸下,我会赌位图或 Drawble。

内存泄漏的最常见原因是未正确管理静态对象并持有对以下内容的引用:

  • 语境
  • 视图(包含对上下文的引用(也可能对位图)
  • 线程(GC不容易收集)
  • 处理程序(保存对上下文的引用)

大多数问题都可以解决,确保在不再需要时将对象设置为 null。

问候。

于 2012-11-27T11:48:48.840 回答
9

Abyte和 aboolean各为 1 个字节。如果你有一个数组,你就有一个“1字节数组”。

例如, AByteBuffer应该在内部持有其中一个。

您总共有 614 个,其中最小的一个是 a byte[24](或boolean[24]),最大的一个是 3MB。它们一起使用 104MB。

如果不再引用它们,GC 将删除它们。

例如,当你放

private static byte myArray[] = new byte[3 * 1024 * 1024];

在你的一个类中并且永远不会将它设置回 null ( myArray = null) 那么这个不能被垃圾收集,因为另一个 Object 有对它的引用。对象将是类本身(如 中String.class)。类对象不能被垃圾回收,因为类永远不会被卸载。(它们被它们引用,而它们ClassLoader本身可能被另一个引用/加载,ClassLoader没有它们就不能创建对象和使用类——它们需要保留并且需要保留对它们的类​​的引用)

它通常不是那么简单,但通常从static某个地方开始。

在 MAT 中(在您强制 GC 之后)查看不再打算保持活动状态的对象的引用链,并确定持有该引用的一个 Object。在你的代码中设置那个null,你的泄漏就消失了。在这里更详细地解释:

http://android-developers.blogspot.de/2011/03/memory-analysis-for-android.html

于 2012-11-27T12:00:05.967 回答
3

今晚我遇到了这个问题,几乎我检查了每一段代码,但我找不到任何东西。

我所做的是从 intelij 启动应用程序,然后按主页按钮并再次打开应用程序。每次应用程序堆增加一倍。

最后我发现当我从 ADB 启动应用程序并按下主页按钮并再次打开应用程序时,它并没有带回旧的活动,它只是开始一个新的活动。当我按下完成时,它开始循环遍历所有这些。就像他们被视为两种不同的意图一样。所以我把android:launchMode="singleTop"主要活动放在清单中,它解决了这个问题。

虽然这不是此问题的主要原因,但如果您遇到此问题,请先检查一下。浪费了我三四个小时。

于 2014-02-19T02:13:49.523 回答