【问题标题】:OutOfMemory Error in ArrayList. AndroidArrayList 中的 OutOfMemory 错误。安卓
【发布时间】:2013-12-11 13:02:19
【问题描述】:

我正在处理 android 上的 http get 请求。

我从服务器收到大量 json 数据,字符串无法处理或存储该数据并出现 OutOfMemory 异常。

然后我尝试将它保存在 arrayList 中,它可以存储最大 Integer.Maximum 值。 但在 ~8970 位置存储时出现 OutOfMemory 异常。

这是我的链接,其中包含 json 数据。

http://ec2-50-19-105-251.compute-1.amazonaws.com/ad/Upload/getitemlist10122013035042.txt

这是我的代码:

ArrayList<String> newarr = new ArrayList<String>();
    try {

        URL url = new URL(urlFilePath);
        HttpURLConnection urlConnection = (HttpURLConnection) url
                .openConnection();

        urlConnection.setRequestMethod("GET");
        // urlConnection.setDoOutput(true);

        // connect
        urlConnection.connect();

        // Stream used for reading the data from the internet
        InputStream inputStream = urlConnection.getInputStream();

        // create a buffer...
        byte[] buffer = new byte[1024];
        int bufferLength = 0;
        int check;
        while ((bufferLength = inputStream.read(buffer)) > 0) {
            String decoded = new String(buffer, 0, bufferLength);
            newarr.add(decoded);    // OutOfMemory Exception.   
        }

        fileOutput.close();
        buffer = null;
        inputStream.close();
        String path = file.getAbsolutePath();
        return path;
    } catch (final MalformedURLException e) {
        e.printStackTrace();
        return "";
    } catch (final IOException e) {
        e.printStackTrace();
        return "";
    } catch (final Exception e) {
        System.out.println("EXCEPTION:: " + e.getMessage());
        e.printStackTrace();
        return "";
    }

【问题讨论】:

  • 尝试使用 StringBuilder 而不是 String 并检查是否有帮助。
  • 感谢您的回复。我刚才试过了,但没有奏效。得到同样的错误。
  • 尝试注释掉newarr.add(decoded);,看看它是否仍然崩溃。
  • 你能追踪到哪个项目 id 出现内存不足错误吗?
  • 为什么这里需要字符串中的数据,因为这是 json 数据。您需要提取 json 数据。你的场景有什么特殊情况吗?如果你只需要数据,那么你可以参考:tutorialspoint.com/json/json_java_example.htm

标签: android json arraylist out-of-memory http-get


【解决方案1】:

您需要直接处理流,而不是将其存储为字符串。以 Gson Stream Reader 为例:

public List<Message> readJsonStream(InputStream in) throws IOException {
    JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
    List<Message> messages = new ArrayList<Message>();
    reader.beginArray();
    while (reader.hasNext()) {
        Message message = gson.fromJson(reader, Message.class);
        messages.add(message);
    }
    reader.endArray();
    reader.close();
    return messages;
}

您可以将此处的 List 视为解析后的结果。如果您想显示它,您也可以使用您正在使用的任何ListAdapter 中的列表。

【讨论】:

    【解决方案2】:

    ArrayList(或任何类型的列表)的最大容量仅受 JVM 可用内存量的限制。

    你可以使用 BufferedReader,或者用 Scanner 代替 String。

    否则,如果你仍然想使用 String,那么尝试增加 JVM。据我所知,没有办法在运行时控制堆大小。

    这可能不是必需的:您可以分别使用 -Xms 和 -Xmx 开关提供最小和最大堆大小。 (例如 -Xms128m -Xmx512m)jvm 将在这些范围内管理实际的堆大小。

    尝试根据你的使用情况设置限制

    如需更多参考,请尝试从

    获得一些想法

    http://www.coderanch.com/t/614644/Performance/java/Arraylist-heapsize-memory-error

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多