我的应用程序中有很多位图。应用程序启动时会加载它们。在一个活动中,我有两个按钮,我在那里更改语言,但是当我点击按钮时,我再次开始加载图像。有时我会因内存不足而出错。我如何清理内存,当我点击按钮时我清理内存并在加载位图后?这有可能吗?现在我使用system.exit(0)
,但我不想关闭所有应用程序。
答案 0 :(得分:4)
前一段时间我遇到了与图形处理密集型应用程序相同的问题,经过大量调试后我发现Bitmap对象没有自动正确释放。
您应该在不再需要它们时立即通过调用它们的循环方法来管理位图(例如,Activity.onStop方法)。
编辑(2014年8月10日):
Android开发人员文档最终包含明确的explanations for these bitmap memory problems。有些事情在同时变得更好,但我们通常仍然需要处理旧的Android版本,这使得位图内存管理变得困难。
以下是要点:
自Android 2.3.3(API级别10)及更低版本
当您已经使用位图(或其他大对象)耗尽Dalvik堆内存限制并尝试加载另一个位图时,问题就出现了。即使您不再对旧位图对象保留任何引用,也不能保证这些位图在 分配新位图对象之前进行垃圾收集 。因此,您可以随机点击限制并获得OutOfMemoryError
。
因此,自己管理位图对象非常重要。完成使用位图后,应在加载另一个位图之前调用其recycle()
方法。
自Android 3.0(API级别11)
以来Dalvik的内存管理员可以看到剩余多少内存并完全控制回收内存。
管理位图
在这两种情况下(较旧的Android版本和较新版本),您可能需要管理位图对象以避免:
Android开发人员文档包含有关如何使用least-recently-used cache (LruCache)缓存和重用已加载的位图对象的详细信息。
答案 1 :(得分:1)
不要调用System.exit(0)
因为它会终止你的JVM。
完成使用后,在每个位图上调用bitmap.recycle()
。这将释放位图获取的本机内存。将位图引用设置为null也会使GC在下次运行时收集它。
答案 2 :(得分:1)
如果未从数据结构中引用未使用的位图并且正确调用了recycle
,则不会出现OutOfMemory异常。一旦你确定这一点,自动垃圾收集器将开始可靠地为你服务,你不需要告诉它何时释放东西。
注意程序中的任何静态变量,尤其是集合或复杂结构。如果在任何地方添加了位图,请确保它再次从那里删除。