Android OutOfMemoryError的理解
2016-04-19 17:36
507 查看
最近写了个测试demo调试网络优化,发现下载20M的文件时我直接申请了20M的空间,然后就OOM导致crash了~~
典型的错误信息如下:
OutOfMemoryError:Out of memory: Heap Size=33887KB, Allocated=22009KB, Limit=49152KB
1,百度一下,有人说是资源没释放内存泄露导致,这种情况只能自己去优化内存管理了,我这个明显不是,我就是要用这么多!!
2,看到有个小哥做了处理能加载5M*20张图片一点事没有,纯代码分享(拍砖表情在此!!链接在次)
3,这个小哥比较霸气(链接在此),提出的方法:
修改内存大小限制定义 (但是: 函数setMinimumHeapSize其实只是改变了堆的下限值,它可以防止过于频繁的堆内存分配,当设置最小堆内存大小超过上限值(Max Heap Size)时仍然采用堆的上限值,对于内存不足没什么作用。)
手动干涉GC
NDK
4,这个小哥总结的很好(链接在此)
缓存图像到内存,采用软引用缓存到内存,而不是在每次使用的时候都从新加载到内存;
调整图像大小,手机屏幕尺寸有限,分配给图像的显示区域本身就更小,有时图像大小可以做适当调整;
采用低内存占用量的编码方式,比如Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省内存;
及时回收图像,如果引用了大量Bitmap对象,而应用又不需要同时显示所有图片,可以将暂时用不到的Bitmap对象及时回收掉;
自定义堆内存分配大小,优化Dalvik虚拟机的堆内存分配;
5,这个小哥说的更清楚一些(链接在此)
总结:
其实我这里的问题主要是EntityUtils.toString的时候一下输出的太大了。
参考 https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/JsonStreamParser.html ,总的来说,不能一下子把大量数据载入内存!!
其实可以自己参考EntityUtils.toString的写法自己实现一个不要一下子全拼到String里的方法:
典型的错误信息如下:
OutOfMemoryError:Out of memory: Heap Size=33887KB, Allocated=22009KB, Limit=49152KB
1,百度一下,有人说是资源没释放内存泄露导致,这种情况只能自己去优化内存管理了,我这个明显不是,我就是要用这么多!!
2,看到有个小哥做了处理能加载5M*20张图片一点事没有,纯代码分享(拍砖表情在此!!链接在次)
3,这个小哥比较霸气(链接在此),提出的方法:
修改内存大小限制定义 (但是: 函数setMinimumHeapSize其实只是改变了堆的下限值,它可以防止过于频繁的堆内存分配,当设置最小堆内存大小超过上限值(Max Heap Size)时仍然采用堆的上限值,对于内存不足没什么作用。)
private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ; VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。 private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ; VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。
手动干涉GC
private final static floatTARGET_HEAP_UTILIZATION = 0.75f; private final static floatTARGET_HEAP_UTILIZATION = 0.75f; // OnCreate VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);
NDK
4,这个小哥总结的很好(链接在此)
缓存图像到内存,采用软引用缓存到内存,而不是在每次使用的时候都从新加载到内存;
调整图像大小,手机屏幕尺寸有限,分配给图像的显示区域本身就更小,有时图像大小可以做适当调整;
采用低内存占用量的编码方式,比如Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省内存;
及时回收图像,如果引用了大量Bitmap对象,而应用又不需要同时显示所有图片,可以将暂时用不到的Bitmap对象及时回收掉;
自定义堆内存分配大小,优化Dalvik虚拟机的堆内存分配;
5,这个小哥说的更清楚一些(链接在此)
总结:
其实我这里的问题主要是EntityUtils.toString的时候一下输出的太大了。
参考 https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/JsonStreamParser.html ,总的来说,不能一下子把大量数据载入内存!!
其实可以自己参考EntityUtils.toString的写法自己实现一个不要一下子全拼到String里的方法:
public long readResponse(HttpEntity entity) throws IOException{ long responseLength = 0; int i = (int)entity.getContentLength(); if(i < 0) { i = 4096; } InputStream instream = entity.getContent(); InputStreamReader reader = new InputStreamReader(instream); // CharArrayBuffer buffer = new CharArrayBuffer(i); try { char[] tmp = new char[1024]; int l; while((l = reader.read(tmp)) != -1) { // buffer.append(tmp, 0, l); responseLength += tmp.length; } } finally { reader.close(); } return responseLength; }
相关文章推荐
- Android-多种进度条的使用方法
- ArrayList(二): Android编程之ArrayList源码详解及使用
- 编译AOSP方便阅读源码
- Android AlertDialog实现分享对话框/退出对话框/下载对话框
- Android中PopupWindow使用详解
- android多点触控统一的原理(使用 event.getAction()&MotionEvent.ACTION_MASK的原因)
- android开发之onCreate( )方法详解
- AndroidのActivity启动模式
- 结合源码探讨Android系统的启动流程
- 结合源码探讨Android距离传感器亮灭屏机制
- Android 驱动开发系列五
- Android 桌面图标消息数提醒
- Android知识补漏
- Android解决ViewPager嵌套Fragment,Fragment嵌套ViewPager滑动冲突
- Android官方开发文档Training系列课程中文版:调用相机之简单摄像
- 用户检测手势Gesture implements android.view.GestureDetector.OnGestureListener
- Android activity组件
- android ImageView亮度变化
- Android中的Serialable和Parcelable的区别
- Android 驱动开发系列四