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 内存溢出oom错误的一些小见解
- 关于下载最新版本Android(安卓)Studio却无法启动默认HelloWorld
- Android(安卓)Installation error: INSTALL_FAILED_INSUFFICIENT
- android在原来的view上画边框或者其它内容
- Android调用本机程序执行文件的方法
- Android性能测试之内存泄露以及GC机制浅析(三)
- AAPT err... ERROR: Unable to open PNG file的解决方案
- [置顶] 自定义漂亮的Android(安卓)SeekBar样式
- Android开发中调用系统设置界面