如果我使用SoftReference将位图存储在哈希图中,SoftReference会在位图上调用.recycle()吗?如果没有,那么在给定的情况下(位图在HashMap中),有什么方法可以正确地从内存中清除位图呢?
发布于 2011-01-03 04:02:48
如果我使用SoftReference将位图存储在哈希图中,SoftReference会在位图上调用.recycle()吗?
不是的。如果您存储的是String或POJO而不是Bitmap,该怎么办?他们有recycle方法吗?当然不是。所以,问题是:SoftReference是用来做什么的?
当您希望被引用的对象保持活动状态,直到主机进程内存不足时,您可以使用
SoftReference。在收集器需要释放内存之前,该对象将不符合收集条件。松散地说,绑定一个SoftReference意味着“固定对象,直到你不能再固定它为止。”(link)
您不必关心清除位图(调用recycle方法);只需让SoftReference完成它的工作即可。
发布于 2011-01-03 04:14:55
来自Bitmap.recycle文档:
This is an advanced call, and normally need not be called,
since the normal GC process will free up this memory when there
are no more references to this bitmap. 因此,弱持有位图就足够了。如果出于某种原因,您需要积极地释放此资源,那么使用弱引用就不太走运了。
编辑
我不熟悉android中的位图实现,但可能会发生的情况是,一些内存不是在堆上创建的,这可能会迫使人们显式地处理位图资源。因此,进程可能会在不需要GC的情况下耗尽内存。想象一下,一个小对象持有从其他地方错位的大内存块。对象的finalize可能准备释放内存,但VM没有理由进行GC,因此本机内存“丢失”。
但在这种情况下,弱引用也不会有帮助,因为它只在gc之后处理。这里唯一有帮助的是显式的“循环”,也许是在引用计数的帮助下。
发布于 2012-10-02 13:54:14
位图的相关资源将在GC时释放,这要归功于它的finalize()方法。recycle()是释放资源,而不是等待它,如果你知道它不再需要,这不是你的情况。您使用SoftReference是因为您希望在出现内存不足的情况时回收图像。
https://stackoverflow.com/questions/4580006
复制相似问题