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

标签 java json out-of-memory 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 的内存或重构代码以降低内存复杂性。

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

关于java - 使用 GSON 将对象转换为 json 时出现 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33023197/

相关文章:

java - Jackson - 仅序列化 Java Pojo 的列表属性中的对象 ID

java - JNI 全局引用持有的 JPanel 导致 OOM 异常

java - 在运行时更新 JTree 节点背景颜色

java - 将变量声明为最终的内部方法会提高性能吗?

javascript - 什么是 JSON VM747 :1 error that happens during JSON parsing?

javascript - 有序列表;使用 javascript 和 json

c# - 将保存的字节数组加载到内存流导致内存不足异常

Java DataOutputStream/DataInputStream OutOfMemoryError

java - 事件驱动编程 - node.js、Java

java - 公开 jhipster 微服务客户端类