Coded9
Coded9

Reputation: 159

GSON: Java out of memory error heap space

I'm trying to convert a large object into json format as a string using the below code,I'm getting out of memory exception.However we are using heap size of 1GB.

gson.toJson(this);

How can we use gson streaming API(https://sites.google.com/site/gson/streaming) to eliminate this error without increasing heap size ?

 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)

Upvotes: 1

Views: 8463

Answers (1)

szab.kel
szab.kel

Reputation: 2536

You can read big Json files without loading the whole thing into memory, by using a streaming approach.

Even Gson supports Streaming: https://google.github.io/gson/apidocs/com/google/gson/stream/JsonReader.html

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

Upvotes: 2

Related Questions