android-discuss
android-discuss copied to clipboard
[问答]谈谈你对Bitmap的理解, 什么时候应该手动调用bitmap.recycle()?
Bitmap是android中经常使用的一个类,它代表了一个图片资源。 Bitmap消耗内存很严重,如果不注意优化代码,经常会出现OOM问题,优化方式通常有这么几种:
- 使用缓存;
- 压缩图片;
- 及时回收;
至于什么时候需要手动调用recycle,这就看具体场景了,原则是当我们不再使用Bitmao时,需要回收之。另外,我们需要注意,2.3之前Bitmap对象与像素数据是分开存放的,Bitmap对象存在java Heap中而像素数据存放在Native Memory中,这时很有必要调用recycle回收内存。但是2.3之后,Bitmap对象和像素数据都是存在Heap中,GC可以回收其内存。
Bitmap容易导致程序无响应或者OOM的原因主要有以下3个: 1、Android设备资源有限,单个应用程序的运行内存只有16M,当然,现在一些设备的这个值或许更大一些。 2、BitMap本身十分大,内存消耗严重,一张2592x1936的手机照片,如果格式为ARGB8888,ARGB分别占8位,一个像素点需要32位(4字节),2592X1936X4bytes约为19MB. 3、Android应用程序通常一次需要加载多张图片,如AblistView,当前显示的可能就有好几张,还要考虑滑动时的预加载的图片,这样如果不进行缓存等优化技术,是必死无疑的。
recycle回收内存,高版本已经不需要我们手动调用了!
手动调用Recycle的情况是:
- 你已经确定你不会再使用这张Bitmap了,这时候清空其引用不去释放,系统GC的时候会释放掉,但是这时候手动去释放会让你的应用程序内存不那么吃紧,而且如果你有很多Bitmap不去手动释放而等待系统GC的时候去释放,那你的应用程序在GC的时候会非常的卡顿,这样体验也不好。
- 如果你监听onTrimMemory回调,那么应该在系统内存比较低的时候,释放掉大部分可以动态生成的资源,比如图片Cache和Bitmap。这样可以保证你的应用程序在低内存的时候不会被杀掉,下一场启动也会快很多。
Mark!