1
我正在使用GSON Stream API將大量對象轉換爲json。該列表包含110.000個對象。我用這個代碼:OutOfMemoryError當使用GSON將對象轉換爲json時
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,從而防止此問題?
任何幫助,非常感謝!
感謝您的回答!我知道錯誤的含義,但我不明白它爲什麼會被拋出。我認爲GSON Stream API可以防止這種情況發生。堆棧跟蹤的其餘部分是沒有用的,它只是重複最後兩行。 – bashoogzaad
堆棧跟蹤將有助於瞭解您的代碼在哪一點破壞。我會假設它發生在'gson.toJson(object,CachedObject.class,writer)',但我無法知道 – vivianig