Android OutOfMemoryError的理解

最近写了个测试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里的方法:

 1         public long readResponse(HttpEntity entity) throws IOException{
 2             long responseLength = 0;
 3
 4             int i = (int)entity.getContentLength();
 5             if(i < 0) {
 6                 i = 4096;
 7             }
 8
 9             InputStream instream = entity.getContent();
10             InputStreamReader reader = new InputStreamReader(instream);
11 //            CharArrayBuffer buffer = new CharArrayBuffer(i);
12
13             try {
14                 char[] tmp = new char[1024];
15
16                 int l;
17                 while((l = reader.read(tmp)) != -1) {
18 //                    buffer.append(tmp, 0, l);
19                     responseLength += tmp.length;
20                 }
21             } finally {
22                 reader.close();
23             }
24             return responseLength;
25         }
时间: 2024-11-01 07:51:31

Android OutOfMemoryError的理解的相关文章

Android下如何理解onMeasure,onLayout的过程

在Android中view如何完成绘制这个过程介绍了很多,但是很多理论化的东西,最近重新整理一下,通俗的讲解一下. View绘制过程就好比你向银行贷款, 在执行onMeasure的时候,好比银行告诉你大概贷款额度有多少?你根据自己的需求,进行各方面的计算,计算出一个自己大概需要的金额,然后告诉询问需要多少贷款.贷款额度好比显示空间大小. 实际代码执行过程是这样 onMeasure(int widthMeasureSpec, int heightMeasureSpec),其中widthMeasur

关于Android的一些理解

Activity中写回调函数 View的回调函数-------->事件回调 Activity层--------------->生命周期回调函数.事件回调函数 Layout是Activity的一个属性.Layout for Activity or app widget. Layout及View的事件处理------------------>事件处理函数---------------->是否在当前Activity Function层-------------->函数体 Data层

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

Android内存管理: 理解App的PSS 原文链接:http://www.littleeye.co/blog/2013/06/11/android-memory-management-understanding-app-pss/ 当在应用程序上运行Little Eye时,在内存视图中,会报告有关应用程序内存的3个重要统计信息. Dalvik内存使用情况,即Java堆消耗的内存量,Native内存,即JVM外部进程使用的内存量. 然后是第三个统计量,被称为"PSS". 什么是PSS?

转:Android Context的理解

本文大多数内容翻译自:http://www.doubleencore.com/2013/06/context/  我重新组织了下内容以及结构,建议大家尽可能看下原文. 1.Context概念 其实一直想写一篇关于Context的文章,但是又怕技术不如而误人子弟,于是参考了些资料,今天准备整理下写出来,如有不足,请指出,参考资料会在醒目地方标明. Context,相信不管是第一天开发Android, 还是开发Android的各种老鸟,对于Context的使用一定不陌生~~你在加载资源.启动一个新的

关于Android API的理解

举个例子: 比如程序中用到了android.content.ClipboardManager这个类, 而该类是在API 11才添加到 “库”. (原谅我,不理解Google API 文档里的 added in API 11这里是将其add到哪里了?如果有高人知道,分外感激) 那么在实际写代码及运行调试时要注意两点: Step 1: Android ApplicationMenifest.Xml文件 <uses-sdk android:minSDKVersion="11这里的数值必须不小于1

Android 常用概念理解

在看Android代码运行机制时,经常会遇到一些不太理解的词,在此把我遇到的一些词以及理解整理下: 1.Android系统,整体来讲它是属于消息驱动型类型,简单说就是系统中应用的各个组件都是靠消息来交互,系统中会有一个主线程会循环执行Looper中的消息队列. 2.编译时:只有编译成功后才能生成可执行代码,简单理解就是语法要符合Android系统的要求,如数学中的运算法则. 3.运行时:简单理解就是当代码执行到那行代码时,(如Android系统中findViewById,只要存在相应id就不会报

[Android分享] 彻底理解ldpi、mdpi、hdpi、xhdpi、xxhdpi

来自: http://www.eoeandroid.com/thread-565562-1-1.html?_dsign=42bed080 非常感谢楼主分享 这个问题我相信困惑了好多人包括很多老鸟,而且有的人以为自己理解其实是错误的,包括之前的我在内,一般让美工做720*1280的切图,就直接放到xhdpi下,如果是做了1080*1920,就直接放到xxhdpi下.其实这四个文件夹和具体的屏幕分辨率是没直接关系的,上面说的做法也有一定道理,因为大部分的720*1280的手机都是高密度手机,1080

谈谈Android(Activity)的理解

Activity原理: .java.xml.resource(数据)之间的调用: java可以通过xml布局文件获取resource数据,value/string.xml.还有别的;也可以通过.java.this.getResource().***(数据资源在R文件中的定位) Activity套件分为五部分 R文件 .xml文件 .java文件 manifiest注册 resource位置 Activity的生命周期: 先说说Activity介绍: Activity就是一个界面系统,只要是界面系

Android service的理解

解析Service之你需要了解的一些东东 Android面试,与Service交互方式