繁体   English   中英

使用GSON将对象转换为json时出现OutOfMemoryError

[英]OutOfMemoryError when converting objects to json using GSON

我正在使用GSON Stream API将大量对象转换为json。 该列表包含110.000个对象。 我使用以下代码:

public static void cacheToFile() {

    Gson gson = new GsonBuilder()
                .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
                .registerTypeAdapter(Date.class, new DateTypeAdapter())
                .create(); 

    try {

        JsonWriter writer = new JsonWriter(new FileWriter(Functions.getAppSupportPath()+"cache.json"));
        writer.beginArray();

        int i = 1;
        synchronized(cache) {

            for (CachedObject<?> object : cache) {
                gson.toJson(object, CachedObject.class, writer);
                System.out.println(i);
                i++;
            }

        }

        writer.endArray();
        writer.close();

    }
    catch (Exception e) {
        Functions.createExceptionDialog(e);
    }

}

循环达到55.000,然后冻结一段时间。 之后,它将引发以下错误:

java.lang.OutOfMemoryError: GC overhead limit exceeded
at com.google.gson.internal.$Gson$Types$WildcardTypeImpl.getUpperBounds($Gson$Types.java:556)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:373)
at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376)
...

我以为Stream API可以防止内存问题,但是在这种情况下却不能。 如何将对象列表转换为json,以防止出现此问题?

任何帮助是极大的赞赏!

循环冻结然后崩溃的原因是GC试图释放足够的内存来继续计算,但无法执行。 这可能是由于同时将太多元素保留在内存中引起的。 解决该问题的唯一方法是增加分配给JVM的内存或重构代码以减少内存复杂性。

如果您可以包括完整的堆栈跟踪信息,可能会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM