的JSONObject的toString()会导致内存不足在1495472字节分配 [英] JSONObject toString() causes Out Of Memory on a 1495472-byte allocation

查看:3143
本文介绍了的JSONObject的toString()会导致内存不足在1495472字节分配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用下面的设备来测试我的应用程序:

I am using the following device to test my app:

我张贴JSON字符串,其尺寸约为498467字节(0.48MB)。

I am posting a JSON string that is about 498467 bytes (0.48MB) in size.

在我的应用程序同步这些数据,它失败的时候我的toString() JSONObect 例如:

When my app syncs this data, it fails when I toString() the JSONObect e.g:

JSONObject jsonObj = new JSONObject();
...
ClientMyAppApi.Upload(getContext(), account.name, jsonObj.toString()); // Out of memory here

下面是LogCat中成绩单:

Here is the LogCat transcript:

D/dalvikvm(21964): GC_CONCURRENT freed 690K, 12% free 10892K/12295K, paused 5ms+9ms
D/dalvikvm(21964): GC_FOR_ALLOC freed 606K, 9% free 11196K/12295K, paused 57ms
I/dalvikvm-heap(21964): Grow heap (frag case) to 11.630MB for 662266-byte allocation
D/dalvikvm(21964): GC_FOR_ALLOC freed 431K, 13% free 11411K/12999K, paused 61ms
I/dalvikvm-heap(21964): Grow heap (frag case) to 12.157MB for 993394-byte allocation
D/dalvikvm(21964): GC_FOR_ALLOC freed 646K, 17% free 11734K/14023K, paused 63ms
I/dalvikvm-heap(21964): Grow heap (frag case) to 12.947MB for 1490086-byte allocation
D/dalvikvm(21964): GC_FOR_ALLOC freed 970K, 22% free 12220K/15495K, paused 69ms
D/AdapterSync(21964): uploadNewContent() JSON request size: 498468
D/dalvikvm(21964): GC_CONCURRENT freed 3172K, 30% free 10892K/15495K, paused 5ms+26ms
D/dalvikvm(21964): GC_FOR_ALLOC freed 606K, 28% free 11195K/15495K, paused 56ms
D/dalvikvm(21964): GC_FOR_ALLOC freed 431K, 27% free 11411K/15495K, paused 59ms
D/dalvikvm(21964): GC_FOR_ALLOC freed 646K, 25% free 11734K/15495K, paused 61ms
D/dalvikvm(21964): GC_FOR_ALLOC freed 970K, 22% free 12219K/15495K, paused 69ms
D/dalvikvm(21964): GC_FOR_ALLOC freed 1459K, 25% free 11742K/15495K, paused 74ms
D/dalvikvm(21964): GC_CONCURRENT freed 664K, 18% free 12726K/15495K, paused 17ms+12ms
D/dalvikvm(21964): GC_CONCURRENT freed 1930K, 18% free 12723K/15495K, paused 22ms+10ms
D/dalvikvm(21964): GC_FOR_ALLOC freed 13K, 18% free 12716K/15495K, paused 70ms
I/dalvikvm-heap(21964): Forcing collection of SoftReferences for 1495472-byte allocation
D/dalvikvm(21964): GC_BEFORE_OOM freed 9K, 18% free 12707K/15495K, paused 114ms
E/dalvikvm-heap(21964): Out of memory on a 1495472-byte allocation.
I/dalvikvm(21964): "SyncAdapterThread-1" prio=5 tid=20 RUNNABLE
I/dalvikvm(21964):   | group="main" sCount=0 dsCount=0 obj=0x4101ac78 self=0x2f5198
I/dalvikvm(21964):   | sysTid=22098 nice=10 sched=0/0 cgrp=bg_non_interactive handle=3325456
I/dalvikvm(21964):   | schedstat=( 5787106417 2132935545 325 ) utm=552 stm=26 core=0
I/dalvikvm(21964):   at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:~94)
I/dalvikvm(21964):   at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:132)
I/dalvikvm(21964):   at java.lang.StringBuilder.append(StringBuilder.java:124)
I/dalvikvm(21964):   at libcore.net.UriCodec.appendEncoded(UriCodec.java:119)
I/dalvikvm(21964):   at libcore.net.UriCodec.encode(UriCodec.java:133)
I/dalvikvm(21964):   at java.net.URLEncoder.encode(URLEncoder.java:57)
I/dalvikvm(21964):   at org.apache.http.client.utils.URLEncodedUtils.encode(URLEncodedUtils.java:184)
I/dalvikvm(21964):   at org.apache.http.client.utils.URLEncodedUtils.format(URLEncodedUtils.java:163)
I/dalvikvm(21964):   at org.apache.http.client.entity.UrlEncodedFormEntity.<init>(UrlEncodedFormEntity.java:57)
I/dalvikvm(21964):   at com.myapp.utils.NetworkUtils.makeHttpRequestWithParams(NetworkUtils.java:177)
I/dalvikvm(21964):   at com.myapp.client.ClientMyAppApi.MakeRequest(ClientMyAppApi.java:208)
I/dalvikvm(21964):   at com.myapp.client.ClientMyAppApi.Upload(ClientMyAppApi.java:395)
I/dalvikvm(21964):   at com.myapp.syncadapter.AdapterSync.uploadNewContent(AdapterSync.java:744)
I/dalvikvm(21964):   at com.myapp.syncadapter.AdapterSync.onPerformSync(AdapterSync.java:120)
I/dalvikvm(21964):   at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:247)
W/dalvikvm(21964): threadid=20: thread exiting with uncaught exception (group=0x409c01f8)
E/AndroidRuntime(21964): FATAL EXCEPTION: SyncAdapterThread-1
E/AndroidRuntime(21964): java.lang.OutOfMemoryError
E/AndroidRuntime(21964):    at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94)
E/AndroidRuntime(21964):    at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:132)
E/AndroidRuntime(21964):    at java.lang.StringBuilder.append(StringBuilder.java:124)
E/AndroidRuntime(21964):    at libcore.net.UriCodec.appendEncoded(UriCodec.java:119)
E/AndroidRuntime(21964):    at libcore.net.UriCodec.encode(UriCodec.java:133)
E/AndroidRuntime(21964):    at java.net.URLEncoder.encode(URLEncoder.java:57)
E/AndroidRuntime(21964):    at org.apache.http.client.utils.URLEncodedUtils.encode(URLEncodedUtils.java:184)
E/AndroidRuntime(21964):    at org.apache.http.client.utils.URLEncodedUtils.format(URLEncodedUtils.java:163)
E/AndroidRuntime(21964):    at org.apache.http.client.entity.UrlEncodedFormEntity.<init>(UrlEncodedFormEntity.java:57)
E/AndroidRuntime(21964):    at com.myapp.utils.NetworkUtils.makeHttpRequestWithParams(NetworkUtils.java:177)
E/AndroidRuntime(21964):    at com.myapp.client.ClientMyAppApi.MakeRequest(ClientMyAppApi.java:208)
E/AndroidRuntime(21964):    at com.myapp.client.ClientMyAppApi.Upload(ClientMyAppApi.java:395)
E/AndroidRuntime(21964):    at com.myapp.syncadapter.AdapterSync.uploadNewContent(AdapterSync.java:744)
E/AndroidRuntime(21964):    at com.myapp.syncadapter.AdapterSync.onPerformSync(AdapterSync.java:120)
E/AndroidRuntime(21964):    at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:247)

什么又是怎样来解决这个内存不足问题的最佳方式?

What and how is the best way to fix this out of memory issue?

推荐答案

虽然这不是一个很优雅的解决方案,你可以尝试添加的android:largeHeap =真正的你的清单。试试这个运行,但我不建议离开它那里,因为它可以导致一些性能问题。

也就是说,如果不解决内存外的问题,它可能会在JSON或code本身是什么地方。

While this is not a very "elegant" solution, you can try adding android:largeHeap="true" to your manifest. Try running with this, but I do not recommend leaving it there since it can cause a few performance issues.
That said, if it doesn't solve the out-of-memory problem, it might be somewhere in the JSON or the code itself.

这篇关于的JSONObject的toString()会导致内存不足在1495472字节分配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆