21

我寫一個程序來同步大量的Android聯繫人數據庫中的聯繫人的。對於大約700個聯繫人,下載工作正常,之後我一直在收到一個內存堆錯誤,它會調用無限數量的GC語句,並最終重新啓動手機。我正面臨着HTC渴望的問題。的Android dalvikvm堆:卡箍目標GC堆

我檢查使用從DDMS堆alocation工具應用程序以及使用提取的Debug.dumpHprofData HPROF文件的堆的大小。這兩個日誌都表明堆大小約爲2.4MB。

但是我得到以下日誌表明堆大小更是32.MB

dalvikvm-heap(92): Clamp target GC heap from 33.999MB to 32.000MB 
dalvikvm(92): GC_FOR_MALLOC freed 2 objects/48 bytes in 313ms 

我已經插入以下在我的contatcs下載邏輯是寫在循環日誌語句。

Log.e("Memory", "free mem =" +runtime.freeMemory()); 
Log.e("Memory", "total memory =" +runtime.totalMemory()); 

這些是語句的初始值和最終值印刷

--------------------------------------------------------------- 
11-11 12:56:04.168: ERROR/Memory(25132): free mem =871248 
11-11 12:56:04.168: ERROR/Memory(25132): total memory =4202464 

--------------------------------------------------------------- 

11-11 13:01:55.408: ERROR/Memory(25132): free mem =891640 
11-11 13:01:55.408: ERROR/Memory(25132): total memory =4726752 

--------------------------------------------------------------- 

這表明apperently有存在於同步的聯繫人邏輯沒有內存泄漏。

可有人請讓我知道爲什麼被堆的大小增加(高達32.00Mb),以這樣一種程度,即設備重新啓動本身?我是Android和Java的新手,所以請在我身上輕鬆一下:))

+1

你能鏈接或粘貼相關的源代碼嗎? – 2011-10-04 20:56:03

+0

看到一些代碼會有所幫助。 無論如何 - 你爲什麼需要將所有聯繫人存儲在內存中? 通常,在同步聯繫人時,會設置一個光標並對查詢進行批處理。您可能不需要一次將所有聯繫人保存在內存中。我錯過了什麼嗎? – Guy 2011-10-17 12:03:37

+1

日誌中的dalvikvm行的進程ID是否是您的進程? – Ifor 2011-10-17 21:39:19

回答

8

雖然這不是最好的答案,但我強烈建議您在Google IO 2011上觀看Memory management for Android Apps演講的視頻。它很好地解釋瞭如何管理內存以及你看到的信息實際上意味着什麼。

2

您需要發佈您的代碼的人提供幫助。否則,我認爲兩件事情:

  • 由於您的手機崩潰,你必須做一些真棒,讓你的程序在虛擬機分配的內存空間之外運行。
  • 您是否將所有聯繫人存儲在列表或數組中?如果是這樣,那就是你的問題。這是Streams擅長解決的問題。
  • 1

    通過下載你的意思是從遠程位置獲取數據?看起來好像你在內存中保存了很多對你的數據的引用。你一定要嗎?根據你想要達到的目標,通常有幾件事你可以儘量減少你的內存佔用。首先,我會確保我不使用任何字符串引用,但我會直接將數據流傳輸給消費者。此外,嘗試處理所有數據塊。你是否還需要將數據保存到文件系統?如果是這樣,直接流式傳輸到文件系統,並避免所有內存一起存儲。如果你發佈了一些代碼,這可能會有所幫助。