在android中清理内存

时间:2012-06-26 05:59:43

标签: android bitmap out-of-memory

我的应用程序中有很多位图。应用程序启动时会加载它们。在一个活动中,我有两个按钮,我在那里更改语言,但是当我点击按钮时,我再次开始加载图像。有时我会因内存不足而出错。我如何清理内存,当我点击按钮时我清理内存并在加载位图后?这有可能吗?现在我使用system.exit(0),但我不想关闭所有应用程序。

3 个答案:

答案 0 :(得分:4)

前一段时间我遇到了与图形处理密集型应用程序相同的问题,经过大量调试后我发现Bitmap对象没有自动正确释放。

您应该在不再需要它们时立即通过调用它们的循环方法来管理位图(例如,Activity.onStop方法)。

编辑(2014年8月10日):

Android开发人员文档最终包含明确的explanations for these bitmap memory problems。有些事情在同时变得更好,但我们通常仍然需要处理旧的Android版本,这使得位图内存管理变得困难。

以下是要点:

自Android 2.3.3(API级别10)及更低版本

  • 像素数据存储在本机内存 ...
  • 中 Dalvik堆内存中的
  • ...和
  • 像素数据以不可预测的方式发布

当您已经使用位图(或其他大对象)耗尽Dalvik堆内存限制并尝试加载另一个位图时,问题就出现了。即使您不再对旧位图对象保留任何引用,也不能保证这些位图在 分配新位图对象之前进行垃圾收集 。因此,您可以随机点击限制并获得OutOfMemoryError

因此,自己管理位图对象非常重要。完成使用位图后,应在加载另一个位图之前调用其recycle()方法。

自Android 3.0(API级别11)

以来
  • 像素数据与位图对象
  • 一起存储在Dalvik堆

Dalvik的内存管理员可以看到剩余多少内存并完全控制回收内存。

管理位图

在这两种情况下(较旧的Android版本和较新版本),您可能需要管理位图对象以避免:

  • 重复加载相同的图像(优化问题)
  • 内存不足(稳定性问题)

Android开发人员文档包含有关如何使用least-recently-used cache (LruCache)缓存和重用已加载的位图对象的详细信息。

答案 1 :(得分:1)

不要调用System.exit(0)因为它会终止你的JVM。 完成使用后,在每个位图上调用bitmap.recycle()。这将释放位图获取的本机内存。将位图引用设置为null也会使GC在下次运行时收集它。

此答案可以帮助您:Catching OutOfMemoryError in decoding Bitmap

答案 2 :(得分:1)

如果未从数据结构中引用未使用的位图并且正确调用了recycle,则不会出现OutOfMemory异常。一旦你确定这一点,自动垃圾收集器将开始可靠地为你服务,你不需要告诉它何时释放东西。

注意程序中的任何静态变量,尤其是集合或复杂结构。如果在任何地方添加了位图,请确保它再次从那里删除。