Android内存泄漏

3
我一直在研究Android中的内存泄漏问题。在我的应用程序中,我遇到了“java.lang.OutOfMemoryError:bitmap size exceeds VM budget”异常。通过谷歌搜索,我发现这是一个常见的错误(这个SO问题这个SO问题都涉及了这个问题),并使用了建议的解决方案。
我找到了一份官方的Android文档来处理这个问题,并且还有一个SO问题来解释官方示例。它在示例中说:

drawable引用了TextView,而TextView本身又引用了Activity(即Context),而Activity又引用了几乎所有内容

但我仍然不明白一件事:如果Drawable没有声明为静态的,为什么它不会在Activity的onDestroy()方法中被销毁?Drawable被销毁,TextView被销毁,Activity被销毁 - 没有引用和内存泄漏。这不是它应该工作的方式吗?


1
请查看此链接:http://mobi-solutions.blogspot.com/2010/08/how-to-if-you-want-to-create-and.html - Lalit Poptani
1个回答

2
我仍然不理解一件事:如果Drawable没有被声明为静态的,为什么它不会在活动的onDestroy()方法中被销毁?Drawable被销毁了,TextView被销毁了,Activity被销毁了 - 没有引用和内存泄漏。这不是它应该工作的方式吗?
是的,这就是它应该工作的方式,但它们可能不会立即在onDestroy()中被销毁。垃圾回收器运行的确切时间无法预测。有许多因素会触发垃圾回收器。例如,如果您的应用程序正在使用允许的堆内存较少,或者如果其他某个应用程序正在尝试分配更多的内存...
如果您想立即销毁位图,应调用Bitmap.recycle()。
有关GC运行方式以及Android中的内存管理的许多其他有用信息都在这个视频中解释:

http://www.youtube.com/watch?v=_CruQY55HOk


在onDestroy()方法中,除了位图之外,还有其他需要手动释放的对象吗? - Maggie
据我所知没有。当然,如果您有打开的文件或流,当您不再需要它们时,应该将它们close() - Caner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接