我正试图检测我的内存泄漏。
在观看video from Google并阅读StackOverflow之后,我开始放弃它,因为我找不到问题。
我的第一个Activity从资源中加载了4个图像(ImageView,每个像素的宽度都不大于400px),我可以在MAT(MainActivity)上找到它:
然后,如果我启动HomeActivity,这会有更多的图像视图,但所有这些都是短小的。所以我加载它,我明白了:
但如果我将正则表达式与HomeActivity或MainActivity一起使用:
而这应该是我的泄密:
我试图不设置一些图片,删除horizontalScrollView,删除一些可能有问题的项目。
我完全迷失了。你知道我做得不好吗?
提前致谢。
答案 0 :(得分:1)
我的第一个Activity从资源中加载了4个图像(ImageView,每个像素的宽度都不大于400px)
首先,ImageView
不是资源。它是一个小部件。
其次,在加载资源时,ImageView
的大小默认无关紧要。
我可以在MAT上找到这个
byte[]
正在消耗大约26MB的堆。如果在树中展开该节点,则应该看到特定的实例。如果您感兴趣,请右键单击它并检查其GC根,以尝试确定它是什么。
所以我加载它,我得到了这个
这显示两个特定的byte[]
,大约12MB,每个大约11MB。右键单击它们并探索它们到GC根的路径,以尝试识别它是什么。
你知道我做得不好吗?
不具体。毕竟,我们没有任何Java代码,任何资源XML或任何其他内容。
如果我不得不猜测,您添加了一些大型图像文件作为可绘制资源,并依赖ImageView
将其缩小为较小的尺寸。没关系,但ImageView
不会减少图像本身使用的堆。这将取决于图像的分辨率(宽度*高度)和图像的位深度(ARGB_8888
通常每像素4个字节)。资源在加载后永远不会被释放,从而加剧了您的问题。你可以:
在编译时自己将图像缩放到更接近运行时实际需要的值,和/或
使用BitmapFactory
和decodeResource()
以及相应的BitmapFactory.Options
实例和inSampleSize
值来更加手动加载图片,在运行时对其进行下采样以消耗减少堆空间,并将其作为常规Bitmap
加载(AFAIK,decodeResource()
不会将资源作为实际资源加载,从而可以在运行时更好地管理它)