最近写了个测试demo调试网络优化,发现下载20M的文件时我直接申请了20M的空间,然后就OOM导致crash了~~

典型的错误信息如下:

OutOfMemoryError:Out of memory: Heap Size=33887KB, Allocated=22009KB, Limit=49152KB

1,百度一下,有人说是资源没释放内存泄露导致,这种情况只能自己去优化内存管理了,我这个明显不是,我就是要用这么多!!

2,看到有个小哥做了处理能加载5M*20张图片一点事没有,纯代码分享(拍砖表情在此!!链接在次

3,这个小哥比较霸气(链接在此),提出的方法:

  1. 修改内存大小限制定义 (但是: 函数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大小。
  2. 手动干涉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);
  3. NDK

4,这个小哥总结的很好(链接在此

  1. 缓存图像到内存,采用软引用缓存到内存,而不是在每次使用的时候都从新加载到内存;
  2. 调整图像大小,手机屏幕尺寸有限,分配给图像的显示区域本身就更小,有时图像大小可以做适当调整;
  3. 采用低内存占用量的编码方式,比如Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省内存;
  4. 及时回收图像,如果引用了大量Bitmap对象,而应用又不需要同时显示所有图片,可以将暂时用不到的Bitmap对象及时回收掉;
  5. 自定义堆内存分配大小,优化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 OutOfMemoryError的理解的更多相关文章

  1. [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解

    原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...

  2. Android动画的理解

    基础知识 在我们开始讲Android动画这个知识点之前,我们了解下相应的基础知识点. Shape篇 一般用Shape定义的XML文件是存放在Drawable目录下,广泛应用于在Button.TextV ...

  3. Android灯光系统--深入理解背光灯

    Android灯光系统--深入理解背光灯 一.怎么控制背光灯(简述) APP将亮度值写入数据库 线程检测数据库的值是否发生变化 这种机制成为"内容观察者"--contentObse ...

  4. 移动端测试===Android内存管理: 理解App的PSS

    Android内存管理: 理解App的PSS 原文链接:http://www.littleeye.co/blog/2013/06/11/android-memory-management-unders ...

  5. Android Adapter基本理解

    感谢大佬:https://blog.csdn.net/l799069596/article/details/47301711 Android Adapter基本理解: 我的理解是: 1.一个有许多ge ...

  6. Android进阶笔记07:Android之MVC 理解

     1. 为什么需要MVC ? 软件中最核心的,最基本的东西是什么?  答:是的,是数据.我们写的所有代码,都是围绕数据的.      围绕着数据的产生.修改等变化,出现了业务逻辑.      围绕着数 ...

  7. 深入Android开发之--理解View#onTouchEvent

    一:前言 View是Android中最基本的UI单元. 当一个View接收到了触碰事件时,会调用其onTouchEvent方法.方法声明如下: ? 1 2 3 4 5 6 7 /**  * Imple ...

  8. 关于Android API的理解

    举个例子: 比如程序中用到了android.content.ClipboardManager这个类, 而该类是在API 11才添加到 “库”. (原谅我,不理解Google API 文档里的 adde ...

  9. 解决初学者学不懂android,不理解android的设计

    最近在忙着搞一个小项目,所以没有来得及写一些原创性的东西,好容易今天中秋节,就趁现在写一些吧,今天仍然看了些老马的视频,尽管这些东西以前都用过,但是感觉仍然学到了不少东西,说给大家听希望大家也要不要不 ...

随机推荐

  1. 懒加载(getter\setter理解)

    为什么要用懒加载 1.首先看一下程序启动过程:(如图) 会有一个mian的设置,程序一启动会加载main.storyboard main.storyboard又会加载箭头所指的控制器 控制器一旦加载, ...

  2. 做web开发和测试,修改hosts指定某个域名访问某个特定的IP后,如何使hosts立即生效的方法

    本文转自SUN'S BLOG,原文地址:http://whosmall.com/post/143 hosts的配置方法: 在windows系统中,找到C:\windows\system32\drive ...

  3. python3--删除所有空目录,第一个有实际用处的程序

    #目标:删除所有空文件夹 #逐个判断某目录下所有项目 #若该项目是目录就进入该目录,完成上一步,不是下一个项目 #判断完所有后判断当前目录是否是空目录,是就删除 #需要管理员权限,否则很多目录无权限 ...

  4. ubuntu安装simplejson模块

    在terminal中输入 sudo apt-get install python-simplejson -y import simplejson print simplejson.dumps(lens ...

  5. WordPress酷炫CSS3读者墙代码

    前几日在大前端看到他站点中最新的CSS3读者墙代码,一看效果绚丽的不得鸟,立刻就开始研究了,多次研究未果,可终究是研究出来了,昨天刚成功,今天啊和童鞋来我站说读者墙头像显示不对,我一看,还真是,头像都 ...

  6. Java集合之HashSet

    1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素.HashSe ...

  7. 总是多次出现 那个同样的 权限错误 _storage_write_error_, 所以一开始就把机器设好setenforce 0

    把根目录下的所有文件/目录, 都设为权限777. 好像没有必要把所有的东西, 都设为777, 实际上问题是由selinux引起的, 所以, 只要把相应的目录, 不一定是所有的目录, 只是要写入内容的目 ...

  8. 【linux使用】bash shell命令行常用快捷键 (转载)

    移动: Ctrl + A: 移动到当前编辑的命令行首, Ctrl + E: 移动到当前编辑的命令行尾, Ctrl + F 或 ->:按字符右移(往命令行尾部方向,前移) Ctrl + B 或 & ...

  9. python --> 正则表达式

    在python中使用正则表达式,需要导入 re 模块 一. 元字符,包括 []  {} | ? * +  .  ^ $ \  () . 号:通配符,一个点号就代表一个字符,一般情况下不能通配换行符 \ ...

  10. SqlServer 常用函数

    case ..   when ..   then ..   else   ..  end