ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

android-最初从位图泄漏了未引用的byte [],但被回收的()导致内存泄漏(直到活动停止)

2019-10-10 03:33:21  阅读:14  来源: 互联网

标签:android memory bitmap out-of-memory memory-leaks



我的位图内存泄漏导致内存不足.我在Android 5.0(Samsung S5)上运行了测试.我已经使用Android Studio(1.5.1 2.0.0预览版7)调查了此问题. HPROF内存转储显示有多个byte []完全对应于我临时使用的特定巨大位图.如果我确定保留对位图的引用,则Android Studio将向我显示一个11MB大小的位图和一个11MB浅尺寸的byte [].如果我不保留对位图的引用,则某些位图将被垃圾回收,并且某些位图最终以byte []的形式出现,而没有传入的引用(即,没有父级),如图所示.

enter image description here

我已经对我的应用程序进行了足够的测试,足以有把握地知道该11MB字节[]是我在内存中存储的大约2891x1000x4位图.一些较小的位图也会泄漏,并且没有传入的引用出现.

上面的位图在子活动中分配.如果我返回到父活动(在相同的过程中,也就是在dalvikVM中)并强制使用2x GC,则会释放内存.退出子活动之前,多个手动GC不会释放内存.

这似乎与我是否运行bitmap.recycle()无关.如果我只是站在应用程序的同一位置并运行从同一视图中生成巨大位图的代码,则这种情况很少发生.如果我在应用程序中移动并从不同的视图生成位图,则位图的出现频率会更高,例如从50%泄漏到10%泄漏.

>这是Android的错误吗?
>我是否以某种方式使用了错误的位图,而Android Studio却无法向我显示正确的内存视图?
>我的理解是正确的,如果下面的参考树中没有父母(见图),那么内存应该由垃圾收集器释放(因此它是Android Bug或studio bug或hprof dump-bug吗?)

解决方法:

我发现了泄漏的解决方案,尽管Android Studios报告未引用的byte []仍然是一个谜.

看来我做过的ImageView

imageView.setImageBitmap(bitmap)

将防止基于GC的byte []基础位图. bitmap.recycle()无济于事,unbinddrawables()也无济于事

if (imageView.getBackground() != null) {
    imageView.getBackground().setCallback(null);
}
setImageBackground(imageView, null);
imageView.setImageBitmap(null);
imageView.setImageDrawable(null);

当我从视图层次结构中删除视图并删除我自己对该视图的所有引用时,然后byte []被GC处理,泄漏就消失了.



标签:android,memory,bitmap,out-of-memory,memory-leaks

专注分享技术,共同学习,共同进步。侵权联系[admin#icode9.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有