【发布时间】:2010-11-05 12:25:10
【问题描述】:
我一直在阅读有关解码位图的性能问题并收到 OutOfMemoryError “位图超出 VM 预算”问题,当时我希望不会出现内存不足并在线阅读,这是一个常见问题,称为许多开发人员的框架。
通常,我在第二次通过时遇到上述错误。假设我成功加载了一个相当大的位图,然后回收它,甚至将 ref 设置为 null。当我第二次调用这个相同的方法时,它会将我的位图加载到内存中......崩溃。
我在这里和网上其他地方的以前的帖子中读到了一些可以使用 BitmapFactory.Options 完成的事情(例如,显式提供输入缓冲区)。但是,在盲目地使用我发现的东西之前,我希望对这些类有更多了解的人可以提供更多的信息。
向 BitmapFactory.Options.inTempStorage 显式提供字节数组与在编码过程中没有它时 BitmapFactory 会做什么有什么区别?为什么/应该对 OutOfMemoryError 有所帮助?它是否提供比默认缓冲区更小的缓冲区,因此在内存不足之前有更多机会进行清理?
当我调用 Bitmap.recycle() 时具体发生了什么,为什么它与将 Bitmap 设置为 null 不同?注意:在我是否(以及何时)出现 OutOfMemory 错误方面,做任何一个或两个都没有影响。
有没有时候我应该明确邀请 GC 参与处理这类问题?我一直在假设 GC 在大多数情况下应该被信任来决定它在何时何地执行它的操作(在 Java 和 .Net 中),因为对集合有更多的后果,而不仅仅是释放内存(而且我个人对它们还不够熟悉,无法做出这个决定)。
更新:
这个视频回答了我的大部分问题:
Google I/O 2011:Android 应用的内存管理
【问题讨论】:
-
这里有同样的问题。请与我们分享您最终找到的最佳做法。
-
我用一个很棒的视频链接更新了我的问题。如果您遇到 OutOfMemoryExceptions 或类似内存问题的任何问题,这是必须注意的。
标签: java android garbage-collection bitmap bitmapfactory