Java 使用GSON将对象转换为json时发生OutOfMemoryError

Java 使用GSON将对象转换为json时发生OutOfMemoryError,java,json,out-of-memory,gson,Java,Json,Out Of Memory,Gson,我正在使用gsonstreamapi将大量对象转换为json。该列表包含110.000个对象。我使用以下代码: public static void cacheToFile() { Gson gson = new GsonBuilder() .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) .registerTypeAdapter(Da

我正在使用gsonstreamapi将大量对象转换为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);
    }

}
我原以为流API可以防止内存问题,但在本例中却没有。如何将对象列表转换为json,防止出现此问题


非常感谢您的帮助

looop冻结然后崩溃的原因是GC试图释放足够的内存以继续计算,但它无法这样做。这可能是因为同时在内存中保留了太多的元素。解决这个问题的唯一方法是增加为JVM分配的内存,或者重构代码以降低内存复杂性


如果可以包含完整的堆栈跟踪,这可能会很有帮助。

looop冻结然后崩溃的原因是GC试图释放足够的内存以继续计算,但它无法这样做。这可能是因为同时在内存中保留了太多的元素。解决这个问题的唯一方法是增加为JVM分配的内存,或者重构代码以降低内存复杂性


如果您能包含完整的堆栈跟踪,这可能会很有帮助。

谢谢您的回答!我知道这个错误是什么意思,但我不明白为什么会抛出它。我认为GSON流API可以防止这种情况。堆栈跟踪的其余部分没有帮助,它只是重复最后两行。堆栈跟踪有助于理解代码在哪一点中断。我假设它发生在
gson.toJson(object,CachedObject.class,writer),但我无法知道谢谢你的回答!我知道这个错误是什么意思,但我不明白为什么会抛出它。我认为GSON流API可以防止这种情况。堆栈跟踪的其余部分没有帮助,它只是重复最后两行。堆栈跟踪有助于理解代码在哪一点中断。我假设它发生在
gson.toJson(object,CachedObject.class,writer),但我没有办法知道
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)
...