2013-05-07 40 views
0

我爲項目使用phonegap,並且在某一時刻我需要獲取用戶的整個地址簿。它在iOS上非常適用,但在android上有時需要2秒,有時會達到20秒。Java/Android:Phonegap聯繫人API內存泄漏,GC_FOR_ALLOC和GC_CONCURRENT

當需要那麼多時間時,我收到很多GC_CONCURRENTGC_FOR_ALLOC LogCat消息。

05-07 18:01:40.869: D/dalvikvm(17847): GC_CONCURRENT freed 379K, 16% free 9756K/11527K, paused 24ms+23ms, total 97ms 
05-07 18:01:42.650: D/dalvikvm(17847): GC_CONCURRENT freed 288K, 15% free 9865K/11527K, paused 30ms+21ms, total 98ms 
05-07 18:01:44.132: D/dalvikvm(17847): GC_CONCURRENT freed 292K, 14% free 9972K/11527K, paused 26ms+22ms, total 114ms 
05-07 18:01:46.064: D/dalvikvm(17847): GC_CONCURRENT freed 276K, 13% free 10121K/11591K, paused 24ms+14ms, total 116ms 
05-07 18:01:47.425: D/dalvikvm(17847): GC_CONCURRENT freed 246K, 13% free 10273K/11719K, paused 13ms+12ms, total 65ms 
05-07 18:01:49.197: D/dalvikvm(17847): GC_CONCURRENT freed 335K, 13% free 10368K/11911K, paused 14ms+16ms, total 72ms 
05-07 18:01:50.638: D/dalvikvm(17847): GC_FOR_ALLOC freed 83K, 14% free 10405K/11975K, paused 32ms, total 32ms 
05-07 18:01:51.329: D/dalvikvm(17847): GC_FOR_ALLOC freed 68K, 14% free 10438K/12103K, paused 37ms, total 37ms 
05-07 18:01:51.329: I/dalvikvm-heap(17847): Grow heap (frag case) to 11.436MB for 130826-byte allocation 
05-07 18:01:51.379: D/dalvikvm(17847): GC_FOR_ALLOC freed 0K, 14% free 10566K/12231K, paused 49ms, total 49ms 
05-07 18:01:52.480: D/dalvikvm(17847): GC_FOR_ALLOC freed 105K, 15% free 10487K/12231K, paused 34ms, total 34ms 
05-07 18:01:52.490: I/dalvikvm-heap(17847): Grow heap (frag case) to 11.545MB for 196234-byte allocation 
05-07 18:01:52.520: D/dalvikvm(17847): GC_FOR_ALLOC freed 127K, 16% free 10551K/12423K, paused 36ms, total 36ms 
05-07 18:01:55.303: D/dalvikvm(17847): GC_FOR_ALLOC freed 233K, 15% free 10658K/12423K, paused 33ms, total 33ms 
05-07 18:01:55.363: D/dalvikvm(17847): GC_FOR_ALLOC freed 1039K, 21% free 9837K/12423K, paused 36ms, total 36ms 

我看了看,發現它與記憶釋放有關。不幸的是,它不取決於我的代碼。生成所有這些消息的代碼片段是cordova框架的一部分。

現在有什麼辦法可以加快聯繫人獲取速度,或避免那些「內存泄漏」?

科爾多瓦項目是開源的,所以這裏是鏈接到自己的github:

https://github.com/apache/cordova-android/tree/master/framework/src/org/apache/cordova

雖然這是,對我來說太重了。在Java中我不夠好,不知道我能做些什麼來避免這些內存問題。

也許我沒有辦法做到這一點。

謝謝你!

+0

供參考:它不是內存泄漏,它只是做垃圾回收的dalvik vm。 – 2013-05-07 17:00:54

+0

@TobiasMoeThorstensen是的,我不確定這個名字。有什麼辦法來減少這種垃圾收集?我無法獲取需要20秒才能檢索聯繫人的應用。 – 2013-05-07 17:02:17

+0

如果您對答案發表評論,請參閱我的帖子,我將根據您收到的反饋意見進行更新。 – 2013-05-07 17:23:02

回答

0

我遇到了一些關於內存泄漏的問題。如果您使用Eclipse,則可以使用Memory Analyzer Tool分析問題。這對你很有幫助。請參閱此post,其中包含有關內存處理的大量信息。

只是一個快速的旁註;我不熟悉phonegap庫,但是你在線程中執行此操作嗎?如果沒有,我可能會嘗試這個。

+1

我完全不知道它是否在線程中完成。 Phonegap允許開發人員僅使用JavaScript調用設備的本機功能。我從JS調用聯繫人API,但後來我不知道會發生什麼。我發佈了他們的github的地址,我可以研究它,但是我在Java上有一些新東西。 謝謝你的內存分析工具。我打算使用它,我會通知你。 – 2013-05-07 17:27:06

+0

我試圖理解墊,但我在這裏游泳。我試圖得到一個頭轉儲,但它只顯示三個進程,一個是MAT,一個是Eclipse,一個是jsp。所以我從日食傾銷,但我不知道什麼時候該做。我在取得聯繫人的過程中完成了這個任務,之後我卻不知道我是否應該這樣做? – 2013-05-10 09:47:12

+0

此外,它看起來像它在一個線程的完成:this.cordova.getThreadPool()執行(新的Runnable(){ 公共無效的run(){ JSONArray解析度= contactAccessor.search(過濾器選項); callbackContext.success。 (res); } }); – 2013-05-10 11:04:02