OutOfMemoryErrorAndroid

OutOfMemoryErrorAndroid,android,out-of-memory,arrays,Android,Out Of Memory,Arrays,大约5天前,我的应用程序运行良好!今天,我试着运行它,它完全疯了 在logcat最终抛出outofmemoryerror之前,我在logcat中收到了这条消息 01-06 04:14:17.088: D/dalvikvm(454): GC_FOR_MALLOC freed 5702 objects / 326856 bytes in 76ms 01-06 04:14:17.228: D/dalvikvm(454): GC_FOR_MALLOC freed 680 objects / 1579

大约5天前,我的应用程序运行良好!今天,我试着运行它,它完全疯了

在logcat最终抛出outofmemoryerror之前,我在logcat中收到了这条消息

01-06 04:14:17.088: D/dalvikvm(454): GC_FOR_MALLOC freed 5702 objects / 326856 bytes in 76ms  
01-06 04:14:17.228: D/dalvikvm(454): GC_FOR_MALLOC freed 680 objects / 157944 bytes in 57ms
01-06 04:14:17.228: I/dalvikvm-heap(454): Grow heap (frag case) to 2.860MB for 121834-byte allocation
01-06 04:14:17.288: D/dalvikvm(454): GC_FOR_MALLOC freed 1 objects / 81232 bytes in 60ms
01-06 04:14:17.378: D/dalvikvm(454): GC_FOR_MALLOC freed 5 objects / 192 bytes in 65ms
01-06 04:14:17.388: I/dalvikvm-heap(454): Grow heap (frag case) to 2.957MB for 182746-byte allocation
....and so on...
最后,这个错误出现了:

01-06 04:24:49.218: E/AndroidRuntime(511): java.lang.OutOfMemoryError
01-06 04:24:49.218: E/AndroidRuntime(511):  at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:97)
01-06 04:24:49.218: E/AndroidRuntime(511):  at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:136)
01-06 04:24:49.218: E/AndroidRuntime(511):  at java.lang.StringBuilder.append(StringBuilder.java:272)
01-06 04:24:49.218: E/AndroidRuntime(511):  at java.io.BufferedReader.readLine(BufferedReader.java:452)
01-06 04:24:49.218: E/AndroidRuntime(511):  at appsbidder.clientstuff.Utils.openURL(Utils.java:285)
01-06 04:24:49.218: E/AndroidRuntime(511):  at appsbidder.clientstuff.Utils.getFeatured(Utils.java:224)
01-06 04:24:49.218: E/AndroidRuntime(511):  at appsbidder.FeaturedAppsActivity$GridViewAdapter.<init>(FeaturedAppsActivity.java:45)
01-06 04:24:49.218: E/AndroidRuntime(511):  at appsbidder.FeaturedAppsActivity.onCreate(FeaturedAppsActivity.java:28)
01-06 04:24:49.218: E/AndroidRuntime(511):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-06 04:24:49.218: E/AndroidRuntime(511):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
01-06 04:24:49.218: E/AndroidRuntime(511):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
01-06 04:24:49.218: E/AndroidRuntime(511):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
01-06 04:24:49.218: E/AndroidRuntime(511):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
01-06 04:24:49.218: E/AndroidRuntime(511):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-06 04:24:49.218: E/AndroidRuntime(511):  at android.os.Looper.loop(Looper.java:123)
01-06 04:24:49.218: E/AndroidRuntime(511):  at android.app.ActivityThread.main(ActivityThread.java:4627)
01-06 04:24:49.218: E/AndroidRuntime(511):  at java.lang.reflect.Method.invokeNative(Native Method)
01-06 04:24:49.218: E/AndroidRuntime(511):  at java.lang.reflect.Method.invoke(Method.java:521)
01-06 04:24:49.218: E/AndroidRuntime(511):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-06 04:24:49.218: E/AndroidRuntime(511):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-06 04:24:49.218: E/AndroidRuntime(511):  at dalvik.system.NativeStart.main(Native Method)
可能在这里:

while((line = rd.readLine()) != null) {

若响应在单行中包含大json,那个么在这一行中可能会出现OutOfMemoryError。您可以通过手动检查响应来验证这一点。

我认为这行代码是错误的:

JSONArray ja = new JSONArray();
      while((line = rd.readLine()) != null) {
          ja = new JSONArray(line);   // in every step of loop, you create an object, that is wrong for memory
      }
而是使用:

JSONArray ja = new JSONArray();
      while((line = rd.readLine()) != null) {
          ja.add(line);
      }

希望这有帮助

我能看到的是,你应该看看这个:

      while((line = rd.readLine()) != null) {
          ja = new JSONArray(line);
      }
因为这个错误是在readLine方法调用时抛出的

01-06 04:24:49.218: E/AndroidRuntime(511):  at java.lang.StringBuilder.append(StringBuilder.java:272)
01-06 04:24:49.218: E/A ndroidRuntime(511):  at java.io.BufferedReader.readLine(BufferedReader.java:452)
你应该试试这个:

char[] buffer = new char[8064];
BufferedReader rd = new BufferedReader(new InputStreamReader(is), buffer.length);
并使用read而不是readLine

rd.read(buffer, 0, buffer.length)
这方面有很多例子

编辑:

从我以前的项目:

readResponse(InputStream inputStream) {

ByteArrayOutputStream stream = new ByteArrayOutputStream ();
byte[] buffer = new byte[8064];

while(true) {
int rd = inputStream.read(buffer)
if(rd == -1)break;
stream.write(buffer, 0 , rd);
}

stream.flush();
buffer = stream.toByteArray();
String response = new String(buffer);
inputStream.close();

return response;
}

如果JSON非常大,我该如何修复它?这不一定有效,因为read方法的第一个参数需要一个char[],而不是byte[]。是的,我实际上只是查看了它。抱歉,真正的问题是我不能用这种方式,因为我的“line”变量是字符串。这里只有readLine是适用的,除非我遗漏了什么好吧,你是在给'line'赋值,它太大了,会导致异常。如果“response”包含换行符(\n),您可以拆分字符串并以这种方式检索行。您的意思是该值对于类型字符串来说太大了吗?我尝试过,仍然存在相同的问题。你认为json可能太大了吗?我不认为,但在一次小搜索后,我发现了一条关于这个的线索,请查看:
readResponse(InputStream inputStream) {

ByteArrayOutputStream stream = new ByteArrayOutputStream ();
byte[] buffer = new byte[8064];

while(true) {
int rd = inputStream.read(buffer)
if(rd == -1)break;
stream.write(buffer, 0 , rd);
}

stream.flush();
buffer = stream.toByteArray();
String response = new String(buffer);
inputStream.close();

return response;
}