我正在为Android Honeycomb编写一个内存使用量很大的应用程序,并且我一直非常小心地在尽可能的情况下回收未使用的位图;实际上,这对于应用程序的正常运行是必要的,因为位图不断地在内存中循环。然而,我刚刚在Activity中实现了onConfigurationChanged(),因此(出于许多原因),我正在尝试将内存释放例程放入onStop()中。
目前我的onStop()方法:
- 将一些View设置为显示默认的Drawable; - 对这些View之前使用过的Bitmap调用recycle (); - 将对Bitmap的引用设置为null。
不幸的是,使用Eclipse内存分析器,似乎这对内存使用没有任何影响。
如你所想象的,在努力释放资源的垃圾收集语言中,我本来希望能有更多的效果。因此,我的问题是:recycle()到底是做什么的?它是否会真正触发垃圾收集,或者即使你调用System.gc(),系统是否会保留该内存,直到它需要清除某些内容?
我知道Bitmap实际上并没有保存在常规堆中,但我认为调用recycle()就足以确保它们从本机堆中删除。
部分答案:
我发现,如果ImageView包含已经被回收的Bitmap,则该Bitmap数据仍会保留在内存中,直到在ImageView上调用setImageBitmap(null)。即使调用setImageResource(...)或setImageDrawable(...)(它们加载了一个相对较小的Nine-patch文件),这也可能是情况(然而MAT分析显示这并没有移除大的Bitmap,它包含在ImageView的私有成员中)。在onStop()中直接调用此函数可以从我们应用程序的堆中削减约10MB。不过,对于Android的早期版本,情况可能并非如此。
目前我的onStop()方法:
- 将一些View设置为显示默认的Drawable; - 对这些View之前使用过的Bitmap调用recycle (); - 将对Bitmap的引用设置为null。
不幸的是,使用Eclipse内存分析器,似乎这对内存使用没有任何影响。
如你所想象的,在努力释放资源的垃圾收集语言中,我本来希望能有更多的效果。因此,我的问题是:recycle()到底是做什么的?它是否会真正触发垃圾收集,或者即使你调用System.gc(),系统是否会保留该内存,直到它需要清除某些内容?
我知道Bitmap实际上并没有保存在常规堆中,但我认为调用recycle()就足以确保它们从本机堆中删除。
部分答案:
我发现,如果ImageView包含已经被回收的Bitmap,则该Bitmap数据仍会保留在内存中,直到在ImageView上调用setImageBitmap(null)。即使调用setImageResource(...)或setImageDrawable(...)(它们加载了一个相对较小的Nine-patch文件),这也可能是情况(然而MAT分析显示这并没有移除大的Bitmap,它包含在ImageView的私有成员中)。在onStop()中直接调用此函数可以从我们应用程序的堆中削减约10MB。不过,对于Android的早期版本,情况可能并非如此。
isRecycled()
,它返回了true
。 - Andrew Wyld