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


更多相关文章

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

随机推荐

  1. Android(安卓)App内文档展示方案整理
  2. Appium移动自动化框架初探
  3. Android学习系列一用按钮实现显示时间
  4. 谷歌宣布Android(安卓)Studio将取代Eclip
  5. Android(安卓)蓝牙相关开发
  6. Android(安卓)实现锚点定位
  7. Android布局整合include界面控件
  8. android kotlin webview内H5调用微信支付
  9. android sqlite支持的数据类型
  10. android GSM+CDMA基站定位--获取移动网络