在做http网络加载图片时当加载到第3张图片的时候发生内存泄露的问题,log如下:
06-01 05:58:52.533: E/dalvikvm-heap(3477): 12742656-byte external allocation too large for this process.
06-01 05:58:52.533: E/GraphicsJNI(3477): VM won't let us allocate 12742656 bytes
06-01 05:58:52.533: D/skia(3477): --- decoder->decode returned false
06-01 05:58:52.533: W/dalvikvm(3477): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
06-01 05:58:52.553: E/AndroidRuntime(3477): FATAL EXCEPTION: Thread-8
06-01 05:58:52.553: E/AndroidRuntime(3477): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
06-01 05:58:52.553: E/AndroidRuntime(3477): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
06-01 05:58:52.553: E/AndroidRuntime(3477): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:459)
06-01 05:58:52.553: E/AndroidRuntime(3477): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:515)
06-01 05:58:52.553: E/AndroidRuntime(3477): at com.example.httptest.MainActivity.refresh(MainActivity.java:79)
06-01 05:58:52.553: E/AndroidRuntime(3477): at com.example.httptest.MainActivity.access$2(MainActivity.java:72)
06-01 05:58:52.553: E/AndroidRuntime(3477): at com.example.httptest.MainActivity$2.run(MainActivity.java:66)
如红色字体所示错误,android程序内存一般限制在16M,当然也有24M的,而android程序内存被分为2部分:native和dalvik,dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是 native+dalvik 不能超过最大限制 ,而且它们之间不能共享,也就是说,native内存用完了,也不能使用dalvik的内存。
Android虽然会自动管理内存,JAVA也有garbage collection (GC )内存回收机制。但是如果程序在一次操作中打开几个M的文件,那么通常会出现下面的错误信息 06-01 05:58:52.533: E/dalvikvm-heap(3477): 12742656-byte external allocation too large for this process.移动终端因为内存有限,往往图片处理经常出现上述的错误。解决方法: 1.明确调用System.gc(); 这种内存回收会有一定的作用,但是请不要太期待。 2.图片处理完成后回收内存。 请在调用BitMap进行图片处理后进行内存回收。 bitmap.recycle(); 这样会把刚刚用过的图片占用的内存释放。 3.图片处理时指定大小 用BitmapFactory解码时加上设置好的options指令(我就是没用options),通常Options如下设定:BitmapFactory.Options options=new Options(); options.inDither=false; /*不进行图片抖动处理*/ options.inPreferredConfig=null; /*设置让解码器以最佳方式解码*/ options.inSampleSize=4; /*图片长宽方向缩小倍数*/ Bitmap img=BitmapFactory.decodeByteArray(buffer, 0, buffer.length, options);
这样修改后,我发现传到手机上的图片一般都是200KB左右了,即缩小为原来的1/4 以上3种是在网络中找到的方法,我的程序中用了bitmap.resycle()解决了问题。
参考文章:
http://blog.csdn.net/jiadebin890724/article/details/7426174
http://zhidao.baidu.com/link?url=pspqY2BB-dw7Kk5163DA9soIi6dmKgbDkbb80N5sAU9BQYb_oixa1hj0y7gzyxbx3EIhnzLjfOO4em2ISaW2iK