1

我有一個Android應用程序,它使用SimpleFramework進行XML序列化。該應用在我測試過的所有真實設備上運行良好,沒有滯後,但在模擬器上運行時,垃圾收集器在每次啓動應用程序時運行約3分鐘。使用簡單框架時Android模擬器中垃圾回收過多(GC_FOR_MALLOC)

這是我迄今觀察到:在剛序列化對象到XML之前

  • 垃圾收集踢
  • 它只是發生之前的第一個對象是序列化並通過網絡發送,並且不發生連續呼叫。
  • 序列化代碼位於一個單獨的庫中,該庫被封裝並添加爲項目中的.jar文件。

下面是logcat的輸出:

07-27 08:17:10.275: D/dalvikvm(682): GC_FOR_MALLOC freed 10179 objects/482344 bytes in 32ms 
07-27 08:17:10.435: D/dalvikvm(682): GC_FOR_MALLOC freed 13927 objects/535968 bytes in 33ms 
....... About 300 more similar entries... 

這是我目前使用序列化的代碼:

public String fromElement(Object request) { 
    Writer writer = new StringWriter(); 
    try { 
     serializer.write(request, writer); 
     String res = writer.toString(); 
     Log.d(LOG_TAG, res); 
     return writer.toString(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return ""; 
} 

顯然,這是佔用了大量的時間,每次我在代碼中進行更改並重新部署應用程序。有沒有其他人在使用libaray時遇到過這種情況,如果有的話,是否有某種方法可以防止每次啓動應用程序時從GC中踢出GC(從eclipse中)?增加堆(目前設置爲vm.heapSize=24)有幫助嗎?還是有不同的解決方案?

回答

1

您需要升級到2.6.7,現在已經完成了註釋處理的重大更改。事實證明,Android有一個相當熟知的註釋問題,與一個不好的java.lang.reflect.Method.equals(Object)實現相關。簡單的2.6.7緩存更多的註釋處理,應該更好。

+0

升級到新版本(2.6.9)似乎解決了這個問題。 – Jeshurun 2013-01-21 17:12:07

0

這是在黑暗中拍攝的,但是您是否嘗試過更改初始jvm堆大小?它是-xms參數。在你的模擬器上它可能太低了,所以在最初的幾分鐘內它總是試圖調整自己的大小並阻止垃圾收集。看看這個鏈接:http://www.caucho.com/resin-3.0/performance/jvm-tuning.xtp

+0

好點,這是否與日蝕堆大小相同?我的日食堆足夠大:'-XX:MaxPermSize = 1G -Xms1G -Xmx2G'。有沒有什麼地方可以專門爲模擬器配置,也許在AVD管理器或其他地方?謝謝。 – Jeshurun 2012-07-27 21:34:03