我正在使用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,防止出现此问题?
非常感谢任何帮助!
答案 0 :(得分:0)
你的looop冻结然后崩溃的原因是GC试图释放足够的内存来继续计算,但它无法做到。这可能是因为同时在内存中保留了太多元素。解决问题的唯一方法是增加为JVM分配的内存,或者通过重构代码来降低内存复杂性。
如果可以包含完整的堆栈跟踪,那可能会有所帮助。