SoftReference是否在Bitmap对象上调用.recycle()

2cu*_*ech 7 memory android image

如果我使用SoftReference将位图存储在hashmap中,SoftReference会在Bitmap上调用.recycle()吗?如果没有,那么在给定情况下(当位图在HashMap内部时)从内存中正确清除位图的方法是什么?

mtr*_*aut 6

来自Bitmap.recycle doc:

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. 
Run Code Online (Sandbox Code Playgroud)

所以,弱势地保持Bitmap就足够了.如果由于某种原因你需要积极地释放这个资源,你就会因为弱引用而运气不好.

编辑

我不熟悉android中的Bitmap实现,但是可能会强制一个人明确处理Bitmap资源的事实是在堆上没有创建一些内存.因此,在不需要GC的情况下,该过程可能会耗尽内存.想象一下,一个小物体拿着一块大块的记忆块,从其他地方开始.可以准备对象的最终化以释放内存,但是没有理由将VM转换为GC,因此本机内存"丢失".

但在这种情况下,弱引用也无济于事,因为它仅在gc之后处理.这里唯一有用的就是在引用计数的帮助下明确"回收".


Cri*_*ian 5

如果我使用SoftReference将位图存储在hashmap中,SoftReference会在Bitmap上调用.recycle()吗?

不.如果不是Bitmap你存储String或POJO怎么办?他们有这个recycle方法吗?当然不.所以,问题是:有什么SoftReference用?

如果SoftReference希望引用的对象保持活动状态,直到主机进程内存不足,则使用a .在收集器需要释放内存之前,该对象将无法进行收集.松散地说,绑定一个SoftReference手段,"钉住对象,直到你不能再." (链接)

您不必关心清除Bitmap(调用recycle方法); 只是让它SoftReference做它的工作.

  • 我找不到romainguy的评论,他提到调用.recycle()来清除位图,否则你会遇到内存问题,如果你问android-dev的人,任何在android上使用过bitmaps的人都知道没有调用. recycle()问题开始出现 (5认同)