2015-10-08 57 views
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,從而防止此問題?

任何幫助,非常感謝!

回答

0

你的looop凍結然後崩潰的原因是GC試圖釋放足夠的內存來繼續計算,但它無法做到。這可能是由於同時將太多元素保存在內存中造成的。解決這個問題的唯一方法是增加爲JVM分配的內存或通過重構代碼來減少內存複雜性。

如果可以包含完整的堆棧跟蹤,可能會有所幫助。

+0

感謝您的回答!我知道錯誤的含義,但我不明白它爲什麼會被拋出。我認爲GSON Stream API可以防止這種情況發生。堆棧跟蹤的其餘部分是沒有用的,它只是重複最後兩行。 – bashoogzaad

+0

堆棧跟蹤將有助於瞭解您的代碼在哪一點破壞。我會假設它發生在'gson.toJson(object,CachedObject.class,writer)',但我無法知道 – vivianig

相關問題