了解Android上的内存泄漏和MAT

时间:2014-06-02 11:29:46

标签: android memory-leaks android-bitmap

我正试图检测我的内存泄漏。

在观看video from Google并阅读StackOverflow之后,我开始放弃它,因为我找不到问题。

我的第一个Activity从资源中加载了4个图像(ImageView,每个像素的宽度都不大于400px),我可以在MAT(MainActivity)上找到它:

enter image description here

然后,如果我启动HomeActivity,这会有更多的图像视图,但所有这些都是短小的。所以我加载它,我明白了:

enter image description here

但如果我将正则表达式与HomeActivity或MainActivity一起使用:

enter image description here

enter image description here

而这应该是我的泄密:

enter image description here enter image description here

我试图不设置一些图片,删除horizo​​ntalScrollView,删除一些可能有问题的项目。

我完全迷失了。你知道我做得不好吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

  

我的第一个Activity从资源中加载了4个图像(ImageView,每个像素的宽度都不大于400px)

首先,ImageView不是资源。它是一个小部件。

其次,在加载资源时,ImageView的大小默认无关紧要。

  

我可以在MAT上找到这个

byte[]正在消耗大约26MB的堆。如果在树中展开该节点,则应该看到特定的实例。如果您感兴趣,请右键单击它并检查其GC根,以尝试确定它是什么。

  

所以我加载它,我得到了这个

这显示两个特定的byte[],大约12MB,每个大约11MB。右键单击它们并探索它们到GC根的路径,以尝试识别它是什么。

  

你知道我做得不好吗?

不具体。毕竟,我们没有任何Java代码,任何资源XML或任何其他内容。

如果我不得不猜测,您添加了一些大型图像文件作为可绘制资源,并依赖ImageView将其缩小为较小的尺寸。没关系,但ImageView不会减少图像本身使用的堆。这将取决于图像的分辨率(宽度*高度)和图像的位深度(ARGB_8888通常每像素4个字节)。资源在加载后永远不会被释放,从而加剧了您的问题。你可以:

  • 在编译时自己将图像缩放到更接近运行时实际需要的值,和/或

  • 使用BitmapFactorydecodeResource()以及相应的BitmapFactory.Options实例和inSampleSize值来更加手动加载图片,在运行时对其进行下采样以消耗减少堆空间,并将其作为常规Bitmap加载(AFAIK,decodeResource()不会将资源作为实际资源加载,从而可以在运行时更好地管理它)

相关问题