2013-12-11 118 views
13

我從dalvikvm得到了太多GC_FOR_ALLOC。 我從REST服務中獲取XML:在一項活動中,我編程解析了大約100行(我),而在其他活動中,我使用SimpleXML解析了大約200行。爲什麼這麼多GC_FOR_ALLOC在一個簡單的應用程序?

在第一個我得到50 GC_FOR_ALLOC。 在第二個我得到像300! (我甚至不能發佈這一切,身體使29579個字符,它只允許30K)

我搜查了,幾乎每個人都抱怨gc_for_「M」的分配,而不是gc_for_「A」lloc。

SimpleXML是因爲創建實例而導致的問題嗎?

我會通過dalvikvm發佈logcat轉儲,也許這些值有一些信息。

非常感謝您的幫助。

12-11 06:13:49.564: D/dalvikvm(6759): GC_FOR_ALLOC freed 362K, 13% free 4116K/4688K, paused 181ms, total 182ms 
12-11 06:13:50.074: D/dalvikvm(6759): GC_FOR_ALLOC freed 303K, 13% free 4134K/4708K, paused 142ms, total 142ms 
.... repeated many times ..... 
12-11 06:14:06.254: D/dalvikvm(6759): GC_FOR_ALLOC freed 73K, 13% free 4159K/4768K, paused 53ms, total 53ms 
12-11 06:14:06.314: D/dalvikvm(6759): GC_FOR_ALLOC freed 103K, 13% free 4159K/4768K, paused 56ms, total 57ms 
12-11 06:14:06.374: D/dalvikvm(6759): GC_FOR_ALLOC freed 29K, 12% free 4203K/4768K, paused 54ms, total 54ms 
12-11 06:14:06.424: D/dalvikvm(6759): GC_FOR_ALLOC freed 73K, 13% fre 
+0

很難在沒有您的代碼的情況下調試您的代碼。 –

+1

如果您使用Google Maps作爲例子,您會收到很多這些消息,但沒有任何處理這些消息的機會。我在消息上使用過濾器(通過日誌消息):^(?!。*(GC_)|(Cache))* $ – cYrixmorten

+0

您是否正在實例化一個循環內的對象? – leandrocastelli

回答

2

可以使用MAT MAT tutorial

找到多少對象創建和垃圾收集。以便您可以優化代碼

+0

謝謝,我會嘗試。我必須說我正在使用模擬器,我無法安裝驅動程序,因爲我不是管理員,而管理員也沒有設法爲我的Nexus S安裝它(這有點棘手)。 這可能與問題有關? –

10

您可以使用DDMS分配跟蹤器(memory debugging docs,舊blog post,ddms docs)查看最近分配的對象。這將向您顯示正在分配的內容,併爲您執行分配的位置提供堆棧跟蹤。

Another blog post介紹MAT和其他相關工具,雖然堆轉儲分析是這類問題不太有用,因爲它通常表明您沒有被釋放的對象,你更感興趣的對象那就是被釋放的

+0

我已經使用過它,並且沒有足夠的對象來創建344Kb的連續300個空閒空間,我也不能在我的程序中實例化這些「巨大」的對象(在此上下文中)。必須有別的東西。 我使用模擬器的事實可以是原因嗎? 謝謝fadden! –

+1

分配跟蹤器僅顯示所選應用程序的最新512個分配。如果您在忙碌的應用程序中抓取忙碌應用程序的快照,則應該能夠了解所有正在分配的內容。此外,請確保您正在觀看正確的應用程序 - 比較日誌文件中的進程ID(示例中的6759)與應用程序的「信息」面板上顯示的內容。 – fadden

5

在Android的Dalvik虛擬機,GC_FOR_ALLOC對象頁頭一步是inovked當dlmalloc佔用的空間是不夠的,新的或heap->bytesAllocated + n > hs->softLimit。您可以將dalvik.system.setTargetHeapUtilization設置得更低,以獲得更多免費堆空間。

1

今天我遇到同樣的問題。 我在代碼中發現了一個未結束的循環,例如while(i < xx),但是我沒有在while body中實現i ++語句。 因此,像你見面的消息出現了。 請首先檢查您的代碼。

+0

感謝您的關注,但沒有這樣的事情。 Dalvik VM的工作方式導致了這一點。前段時間我寫了這個問題,所以我不記得發生了什麼。 我可以說的是,內存是Android中的一個真正的問題,我們應該非常小心! –

2

如果在應用程序滯後的情況下得到多個GC_FOR_ALLOC,則錯誤處於循環狀態的可能性很大。檢查代碼行開始觸發GC,然後開始跟蹤代碼。根據我的經驗,我錯誤地輸入了內部循環迭代器,導致程序無限循環。我創造了這樣一個錯誤:

for(int i=0; i<list.size(); i++) { 
    for(int j=i+1 j<list.size(); i++) { 

    // I mistyped the iterator of integer j with i 
    // making an infinite loop which triggered the GC. 
    //appears many times 

    } 
} 
0

我的日誌:

D/dalvikvm: GC_FOR_ALLOC freed 549K, 9% free 7878K/8596K, paused 30ms, total 34ms 

...freed 539K, 9% free 7888K/8596K, paused 30ms, total 30ms 
...freed 1856K, 21% free 8083K/10108K, paused 51ms, total 51ms 
...freed 582K, 9% free 7845K/8596K, paused 38ms, total 38ms 

解釋:

當你的應用程序獲得每個應用程序的內存更多的限制。 Dalvik/Ant調用垃圾回收器。

什麼限制你的應用程序的內存決定Dalvik/Ant。正如你看到我的應用程序Dalvik決定8596K(雙案例)和8083K(一例)。

並限制運行時變化。

而且你不能確定何時發生這種情況。但是你可以減少可能性。減少應用程序消耗的內存量。

PS:決定何時調用GC挑選Dalvik/Ant。你不能確定什麼時候發生這種情況。但是你可以減少可能性。減少應用程序消耗的內存量。

PS:在「Monitor android」中查看標籤「Monitors」,圖形「Memory」。並使用按鈕:「暫停(啓用)」,啓動GC,「轉儲Java堆」「開始位置跟蹤(非常有用)」。並使用官方指南:

https://developer.android.com/studio/profile/am-memory.html?utm_source=android-studio

據我瞭解,當VM調用GC時,App不能停止/暫停工作或崩潰。

相關問題