android内存分析 outOfMemoryError错误定位及分析策略(非显示图片造成)

原创 2016年06月01日 16:01:36

三星SMT310平板运行移动学习4.0系统,运行一会儿啥也不干就会报错,闪退。查了一下日志,非图片造成的OOM错误:

06-01 14:16:20.130: D/DBManagerHelper(12700): java.lang.OutOfMemoryError
06-01 14:16:20.130: D/DBManagerHelper(12700): at org.apache.http.util.CharArrayBuffer.expand(CharArrayBuffer.java:59)
06-01 14:16:20.130: D/DBManagerHelper(12700): at org.apache.http.util.CharArrayBuffer.append(CharArrayBuffer.java:77)
06-01 14:16:20.130: D/DBManagerHelper(12700): at org.apache.http.util.EntityUtils.toString(EntityUtils.java:136)
06-01 14:16:20.130: D/DBManagerHelper(12700): at org.apache.http.util.EntityUtils.toString(EntityUtils.java:146)
06-01 14:16:20.130: D/DBManagerHelper(12700): at com.handsome.C_WebServicesTools.HttpRequestHelper.postRequest(HttpRequestHelper.java:84)
06-01 14:16:20.130: D/DBManagerHelper(12700): at com.handsome.A_Activity.SettingsActivity$4.run(SettingsActivity.java:190)
06-01 14:16:20.130: D/DBManagerHelper(12700): at java.lang.Thread.run(Thread.java:856)

1、我擦了,别的平板都不这样,就这个平板有问题,是为什么捏,找到具体错误行数,是:

json.getString("responseList");

2、这也没什么错啊,是因为返回的responseList里面的数据太多造成内存增大么。不对,之前更新数据的时候解析过4 5M的数据都没问题。

3、那是为什么呢,没办法了,看DDMS分析吧,DDMS点击顺序:

4、在右侧heap栏中点击“cause GC" (调用一次GC)即可出现数据

5、发现内存再重新登录后不断的增大,一直到60M,之后就崩了,哭晕在厕所。下个MAT查看详细leak原因:

6、导出hprof文件后,导入MAT报错:

7、百度一下,是由于什么jb玩意,用sdk转换一下就行了:

8、转换完毕后导入MAT,出现以下画面:

9、先点击suspect1的details,查看详细原因,如下图所示:

10、不出所料,还是json解析的问题,单击查看详细引用:

11、查看retained heap,发现占了快5M的内存,把值复制出来一看,竟然有现在和之前请求的所有json数据,崩溃呀,默默的点回我的请求webservice的工具类:

12、两个请求,让我用了static,将请求回来的数据和接下来的解析方法都给同化成static静态方法,造成了请求的所有数据都存入到了内存的静态数据区中,没有被释放。

13、悲剧呀。

14、将static去掉,用单例模式调用,调用方法改为:

String strResult = HttpRequestHelper.getInstance().getRequest(url);

15、再次在SMT310平板运行改程序,不报错了,没问题了。

16、妈蛋,查看了一下智能教学管理系统和智能教学管理系统教师端,都是像上面的调用方法,就移动学习偷懒了,整成static的了,坑了自己一次。

 

未完后续:

17、之后还是崩溃,只不过崩溃的频率比原来少了很多,还是有问题,放到三星not3手机上运行也报错,疯了,看来确实有问题,查看三星手机的报错信息,这回有惊喜了:

java.lang.OutOfMemoryError: Failed to allocate a 8388620 byte allocation with 3853903 free bytes and 3MB until OOM
 at org.apache.http.util.CharArrayBuffer.expand(CharArrayBuffer.java:59)
 at org.apache.http.util.CharArrayBuffer.append(CharArrayBuffer.java:77)
 at org.apache.http.util.EntityUtils.toString(EntityUtils.java:136)
 at org.apache.http.util.EntityUtils.toString(EntityUtils.java:146)
 at com.handsome.C_WebServicesTools.HttpRequestHelper.postRequest(HttpRequestHelper.java:84)
 at com.handsome.C_WebServicesTools.LogicHttpRequest$3.run(LogicHttpRequest.java:102)
 at java.lang.Thread.run(Thread.java:818)

18、百度查:Failed to allocate a 8388620 byte allocation with 3853903 free bytes and 3MB until OOM。

19、很多内容,但是并没有什么帮助,就是一些内存没办法释放的解释。

20、找到HttpRequestHelper 84行,发现EntityUtils.toString(httpResponse.getEntity())报错

21、于是干脆搜:EntityUtils.toString(httpResponse.getEntity()) outofmemory

22、终于找到了问题的答案:

http://blog.csdn.net/wangpeng047/article/details/19624529文章中说:

23、http://www.cppblog.com/iuranus/archive/2010/07/04/119311.html文中这样解释:

24、修改接收方式即可,修改后的接收代码:

          HttpEntity entity = httpResponse.getEntity();
              String result = null;
              if (entity != null)  {     
                  InputStream is = entity.getContent();    
                  result = convertStreamToString(is);     
                  result = result.replace("\n", "");    
                  httpPost.abort();
                 }
              //------------解决OOM方案
              Log.i(TAG, TAG + ":httpPost result :" + result);
              return result;

25、这回终于不报错了

26、其实在第1步的时候就应该按照第20步的方式做,下次就有经验了

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android程序运行时出现java.lang.OutOfMemoryError 错误

Android程序运行时出现java.lang.OutOfMemoryError 错误 如下图所示:
  • cxc19890214
  • cxc19890214
  • 2014年10月14日 22:13
  • 2058

Android "java.lang.OutOfMemoryError"的若干种情形及解决方式

OOM就是内存溢出,即Out of Memory。也就是说内存占有量超过了VM所分配的最大。怎么解决OOM,通常OOM都发生在需要用到大量内存的情况下(创建或解析Bitmap,分配特大的数组等),这里...
  • chichengjunma
  • chichengjunma
  • 2017年01月07日 14:23
  • 880

Android out of memory 彻底解决Android因加载多个大图引起的OutOfMemoryError,内存溢出的问题

最近因为项目里需求是选择或者拍摄多张照片后,提供滑动预览和上传,很多照片是好几MB一张,因为目前的Android系统对运行的程序都有一定的内存限制,一般是16MB或24MB(视平台而定),不做处理直接...
  • wulianghuan
  • wulianghuan
  • 2013年09月11日 01:08
  • 35787

Android_OutOfMemoryError

在开发当中,加载图片的时候出现的问题。
  • lovewaterman
  • lovewaterman
  • 2014年07月23日 10:41
  • 8867

Android遇到内存溢出(Out Of Memory)BUG的经验与解决方法

这阵子的程序经常出现OutofMemoryError的问题。而且都是在图片处理的时候。所以头痛了几天。看到下面这个文章后,我的问题得到了最终的解决,感谢作者。 原文如下: ...
  • tornadofeng
  • tornadofeng
  • 2015年03月05日 11:34
  • 7733

Android关于OutOfMemoryError的一些思考

很多的时候,我们使用Bitmap不会出现多大的问题。但是当机器资源不够的情况下,很多应用都会报出 OutOfMemoryError,当然报出这样的异常往往是给Bitmap分配内存时内存不足引起的。即便...
  • long33long
  • long33long
  • 2012年06月14日 16:34
  • 4469

理解Android应用内存限制与高效加载大图片

理解Android应用内存限制与高效加载大图片 getMemoryClass getLargeMemoryClass android:largeHeap="true" 使用BitmapFactory....
  • hehe26
  • hehe26
  • 2016年10月18日 11:48
  • 2352

Android内存优化(3)-Android系统堆内存限制浅析

Android的Dalvik虚拟机,和Java虚拟机有很多类似的特点,比如它们的对象都是创建在堆上的。 但是,虚拟机本身对堆内存的大小是有限制的。如果在堆内存已经用满的时候,再想创建一个新的对象...
  • tianshuguang
  • tianshuguang
  • 2015年10月27日 10:16
  • 3008

再次遇到OutOfMemoryError(新的原因造成)

移动学习4.0,在作业、资源、活动页面快速来回切换时,容易OutOfMemoryError,查看报错信息 java.lang.OutOfMemoryError at com.alibaba.fast...
  • jbb0403
  • jbb0403
  • 2016年07月14日 11:29
  • 1404

sqlite报错处理--“out of memory Error opening database”

使用SQLite数据库在open时报错“out of memory Error opening database”? 关于该错误,需要有以下几个注意的点,认真检查,便可解决: 1.该路径下...
  • bootleader
  • bootleader
  • 2017年04月09日 22:09
  • 513
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android内存分析 outOfMemoryError错误定位及分析策略(非显示图片造成)
举报原因:
原因补充:

(最多只允许输入30个字)