我有一个应用程序,创建了一系列的位图。为了避免内存不足,我将这些位图保存在软引用中。在堆大小达到16MB之前,我希望堆大小可以增长到最大值,然后再开始回收我的软引用。但是,在增长堆大小到其最大值之前,软引用会被过于积极地回收。是否有办法减少软引用的回收频率?或者手动将堆大小增加到最大值?可能有一种方法只分配16MB的内存来启动应用程序吗?
目前没有办法修改SoftReference集合的行为。
我不确定你所说的“手动将堆增长到最大”是什么意思。
如果这些实例是Bitmap类的实例(而不是某个自定义位图实现),那么像素数据实际上存储在本地堆上,但使用了令人讨厌的“外部分配”记账技巧,这进一步复杂了情况。(值得注意的是,存储是由终结器而不是GC释放的,并且终结器必须在GC完成后在单独的线程中执行。可以分配位图直到耗尽内存,而GC无法在抛出OOM错误之前释放内存。)
这是一个已知的安卓问题。当虚拟机收集软引用时,它要么全部收集,要么不收集,尽管它应该只收集“一些”,并且在有足够的空闲堆时不应该收集任何东西。
请查看:http://code-gotcha.blogspot.com/2011/09/softreference.html