Android内存溢出错误和LruCache

5
首先,我知道有很多相关的帖子,我已经看了很多,但都没有帮助,我已经没有任何想法了 :)
所以我正在开发一个 Android 应用程序(sdk 版本 14+),其中使用了大量的图像(用于按钮、标志、显示许多图像等)。平均图像大小为 120kb+-100kb。
如标题所述,我遇到了 OutOfMemory 错误。起初我将图像源添加到 xml 中的 ImageViews 或通过 setImageResource 在程序中动态设置。不久应用程序由于 OutOfMemory 错误而崩溃。因此,我阅读了这个( http://developer.android.com/reference/android/util/LruCache.html)教程,并按照其说明实现了 LruCache。我将位图添加到 lrucache 中,然后使用 get 方法将位图设置到 imageview 中。
在活动的 onDestroy 方法中,我调用了 lrucache 上的 evictAll 方法,并将 lrucache 设置为 null。因此,我认为内存就被释放了。
然而问题仍然存在,当我浏览几个活动时,应用程序会崩溃。
非常感谢您的帮助 :)

你尝试过使用磁盘缓存吗?http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html - the-ginger-geek
你是把所有的图片都放在drawable文件夹里吗?如果是的话,尝试根据设备的密度将它们放在不同的drawable-?dpi文件夹中... - nidhi_adiga
3个回答

4

谢谢大家,你们帮了我很多!

如果有人遇到同样的问题,请参考以下几点建议:

  • 当你不需要位图时,请调用.recycle()。
  • 使用Eclipse Memory Analyzer来查找你的问题。
  • (必须) 观看视频。
  • 这里讲解如何从.hprof文件中查看位图。

3
根据文档,超过最大可用虚拟内存将抛出OutOfMemory异常。似乎缓存位图超出了可用的虚拟内存。
当不使用时,请回收位图。
 bitmap.recycle();

何时应该使用LRUCache回收一个Bitmap?请查看commonsware所接受的答案。

我相信当LRUCache为其他图片腾出空间时,内存并没有被释放。(由上述链接中的用户提问)

在Bitmap被回收或进行垃圾回收之前,它不会被释放。(由commomsware回答)。

http://www.youtube.com/watch?v=_CruQY55HOk。介绍了内存管理、内存泄漏以及使用MAT分析器。


我仍在努力解决这个问题。我在lrucache类的entryRemoved方法中调用位图的recycle方法,但它并没有解决问题。我认为它会起作用,因为我在activity的onCreate方法中将所有必要的图像添加到缓存中。然后这些图像在activity的生命周期内被使用。 - user1788084
使用MAT分析器来查找和修复问题。 - Raghunandan
我的应用程序使用了更多的内存,堆不断增加,并且出现OOM错误。有什么解决方案吗? - GvSharma
@GvSharma 没有太多的信息,没有人能够提供建议。如果是因为图像降低,请检查 Google Plus 社区上的 Android 性能模式。 - Raghunandan

1
你是否将所有图像都存储在堆中?如果是的话,应该将它们缓存到SD卡或内部存储器中,并仅在堆中保留其中一些(使用LRU缓存的好方法)。
如果你已经这样做了...你可以下载内存分析工具并调试你的应用程序的内存使用情况。

http://www.eclipse.org/mat/

处理内存溢出错误可能会非常痛苦。

祝好运!


谢谢回复,但问题是我需要在整个活动生命周期内使用所有的图像。我相信一些图像即使活动被销毁后仍然存在于内存中,因为错误只发生在我“循环”通过几个活动时(有时候错误相对较早出现,有时不是)。 - user1788084

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