标签:
最近写了个测试demo调试网络优化,发现下载20M的文件时我直接申请了20M的空间,然后就OOM导致crash了~~
典型的错误信息如下:
OutOfMemoryError:Out of memory: Heap Size=33887KB, Allocated=22009KB, Limit=49152KB
1,百度一下,有人说是资源没释放内存泄露导致,这种情况只能自己去优化内存管理了,我这个明显不是,我就是要用这么多!!
2,看到有个小哥做了处理能加载5M*20张图片一点事没有,纯代码分享(拍砖表情在此!!链接在次)
3,这个小哥比较霸气(链接在此),提出的方法:
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大小。
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);
4,这个小哥总结的很好(链接在此)
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 }
标签:
原文地址:http://www.cnblogs.com/icxy/p/5408666.html