我使用了几个大型drawable,我不知道如何管理内存泄漏。 我跟踪了我的应用程序的堆大小,它不会停止增长(作为分配的内存)。
特别是“字节数组(byte [])”类型,它长大后永不减少。 (在Eclipse上的DDMS堆视图中)
我的应用程序由一个使用片段的活动组成。 那些片段正在显示几个大图像。 我试图将drawables回调设置为null,将drawables设置为null,清除我的易失性缓存(这会阻止我的应用程序执行太多磁盘IO)当我弹回一个片段但堆永远不会减少时。
事实上,每次我打电话: Drawable.createFromResourceStream(context.getResources(),value,new FileInputStream(f),f.getName(),opts); 堆长大了。我怎样才能释放记忆?
谢谢!
答案 0 :(得分:6)
当Java在内存中找到代码引用的对象时,会发生内存泄漏,这会阻止垃圾收集器释放此内存。 Android中的常见原因是引用Activity上下文而不是Application上下文。确保您的上下文引用了应用程序(即使用getApplicationContext
而不是this
。请查看此video以获取有关内存泄漏的说明,并检查此question。
答案 1 :(得分:2)
问题似乎已得到解答,但Romain Guy的帖子似乎与获取更多信息相关:Avoiding Memory Leaks。
显然,如果您(例如)通过使用setBackgroundDrawable *将drawable作为背景图像设置为文本视图(从而将drawable附加到视图),则更改方向(销毁活动并重新绘制UI)drawable仍然可以访问旧活动(在旧活动被破坏之后),从而造成内存泄漏。
*(作为附注 - setBackgroundDrawable已经deprecated since API level 16)