java - GSON:Java 内存不足错误堆空间

标签 java json string gson android

我正在尝试使用以下代码将大对象转换为 json 格式作为字符串,但出现内存不足异常。但是我们使用的堆大小为 1GB。

gson.toJson(this);

我们如何使用 gson Streaming API( https://sites.google.com/site/gson/streaming ) 来消除这个错误而不增加堆大小?

 Caused by: java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:2367)
        at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)
        at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114)
        at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:415)
        at java.lang.StringBuffer.append(StringBuffer.java:237)
        at java.io.StringWriter.write(StringWriter.java:112)
        at com.google.gson.stream.JsonWriter.string(JsonWriter.java:576)
        at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:402)
        at com.google.gson.stream.JsonWriter.value(JsonWriter.java:417)
        at com.google.gson.internal.bind.TypeAdapters$16.write(TypeAdapters.java:426)
        at com.google.gson.internal.bind.TypeAdapters$16.write(TypeAdapters.java:410)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
        at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:208)
        at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:112)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:239)
        at com.google.gson.Gson.toJson(Gson.java:661)
        at com.google.gson.Gson.toJson(Gson.java:640)
        at com.google.gson.Gson.toJson(Gson.java:595)
        at com.google.gson.Gson.toJson(Gson.java:575)

最佳答案

通过使用流式传输方法,您可以读取大的 Json 文件,而无需将整个文件加载到内存中。

甚至 Gson 也支持流式传输:https://google.github.io/gson/apidocs/com/google/gson/stream/JsonReader.html

另外:JAVA - Best approach to parse huge (extra large) JSON file

关于java - GSON:Java 内存不足错误堆空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46887607/

相关文章:

java - Twitter4J - 在不登录的情况下查看个人资料详细信息

java - 从 javax.json.JsonObject 中移除键值对

json - 检查 Postgres 中 JSON 值的值类型

ruby-on-rails - RABL - 子节点内的属性

c# - 具有字符串字段(或字节数组)(非值类型)的 .NET 结构是否可以提高内存效率?

ruby - 奇怪的行为破坏了字符串的某些部分,但只有特定的字符,Atom,RSpec

java - 简单的依赖注入(inject)不起作用

java - 安卓:面向对象 |使用其他文件中的函数

java - 基于 JSON 对象创建 HashMap

php - implode() 字符串,但也在末尾附加胶水