android 内存泄露--加载网络图片--android 12742656-byte external allocation too large for this process.

在做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


你可能感兴趣的:(android 内存泄露--加载网络图片--android 12742656-byte external allocation too large for this process.)