【问题标题】:android java not enough sequential memory for stringbuilderandroid java没有足够的顺序内存用于stringbuilder
【发布时间】:2013-08-31 16:53:03
【问题描述】:

我的应用正在解析大型 http 响应,http 响应超过 6 兆字节并且是 json,但不是标准架构。

        final char[] buffer = new char[0x10000];
        StringBuilder out = new StringBuilder();
        Reader in = new InputStreamReader(is, "UTF-8");
        int read;
        System.gc();
        do
        {
            read = in.read(buffer, 0, buffer.length);
            if (read > 0)
            {
                out.append(buffer, 0, read);
            }
        } while (read >= 0);
        in.close();
        is.close();
        in = null;
        is = null;
        System.gc();
        return out.toString();

无论是否有来自文件的缓冲读取器或输入流,StringBuilder 根本无法包含整个对象并且它在out.append(buffer, 0, read); 处失败,或者它将在out.toString() 处失败,因为可能会制作另一个副本

来自 apache 库的IOUtils.copy 在后台做同样的事情,它也会失败。

如何读取这个大对象以进行进一步操作。目前,此方法在 Android 2.2 和 2.3 设备上失败,并且在较新的设备上使用的内存比我想要的要多。

类似的问题都有答案,包括附加到字符串生成器、逐行阅读,或者只有提示的不完整解决方案,这不起作用。

【问题讨论】:

    标签: java android heap-memory inputstream stringbuilder


    【解决方案1】:

    您需要做以下两件事之一:

    1. 从服务器获取多个较小的 JSON 响应并解析它们。这在移动设备上可能更可取,因为大块数据可能无法可靠传输,这将导致设备重复请求整个数据。
    2. 使用流式 JSON 解析器(例如 Jackson)来处理传入的数据。

    【讨论】:

    • hm,关于使用 Jackson,这将需要我重写整个应用程序中使用的整个 httpget 方法。其次,这是否意味着对于这个 api 调用,我需要一个声明每个变量的对象?它也有嵌套对象
    • 好吧,杰克逊实际上在同一地点崩溃了“java.lang.StringBuilder.toString(StringBuilder.java:663)”,因为它似乎也在内部使用了字符串生成器!嗯
    • 我选择了 GSON,感谢您为我指明了流解析器的正确方向
    猜你喜欢
    • 1970-01-01
    • 2018-05-12
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多