2013-04-22 354 views
8

當我在模擬器上運行我的應用程序的logcat將顯示有關信息:等待併發GC阻塞

04-22 16:21:30.685: D/dalvikvm(967): GC_CONCURRENT freed 1545K, 20% free 7019K/8720K, paused 78ms+17ms, total 360ms 

04-22 16:21:30.685: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 143ms 
04-22 16:21:31.845: D/dalvikvm(967): GC_CONCURRENT freed 1552K, 20% free 7019K/8720K, paused 116ms+18ms, total 554ms 

04-22 16:21:31.845: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 268ms 
04-22 16:21:32.435: D/dalvikvm(967): GC_CONCURRENT freed 1545K, 20% free 7019K/8720K, paused 75ms+9ms, total 192ms 

04-22 16:21:32.435: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 73ms 
04-22 16:21:32.945: D/dalvikvm(967): GC_CONCURRENT freed 1552K, 20% free 7019K/8720K, paused 75ms+10ms, total 209ms 

04-22 16:21:32.945: D/dalvikvm(967): WAIT_FOR_CONCURRENT_GC blocked 70ms 
04-22 16:21:33.434: D/dalvikvm(967): GC_CONCURRENT freed 1545K, 20% free 7019K/8720K, paused 78ms+12ms, total 192ms 

,這樣下去,直到我退出application.Any建議感謝

回答

2

這意味着你在做什麼?太多的操作和大量的內存正在被使用。因此,GC(垃圾回收器)正在被調用以釋放內存。

04-22 16:21:30.685:d/dalvikvm(967):GC_CONCURRENT釋放1545K,20% 免費7019K/8720K,暫停78ms + 17MS,總360ms

釋放指示如何釋放大量內存

GC_CONCURRENT當堆變得太大以防止溢出時調用。

暫停78ms + 17ms - 指示GC完成採集需要多少時間。

Refer

另外採取內存轉儲和分析轉儲使用MAT工具。

6

好像你正在創造許多新的物體並很快將它們扔掉。

對於WAIT_FOR_CONCURRENT_GC看到這一個: what does WAIT_FOR_CONCURRENT_GC blocked mean?

這意味着你嘗試分配內存(例如對象的創建),它不適合到內存中。這就是GC_CONCURRENT釋放的原因。它只是通常的垃圾收集。

如果您遇到性能問題,請嘗試重新使用對象或將其備用。

1

主要同意@luxer,但我相信這不是你分配的對象太多,而是你正在分配一些巨大的對象。如果您引用了由@luxer指向的關於WAIT_FOR_CONCURRENT_GC的鏈接,您將會意識到在應用程序中觸發了第二個gc,而併發gc(通常在堆佔用達到軟限制時觸發)正在進行中。第二個gc可能是由您明確觸發的,或者是因爲分配失敗。既然你沒有表明你在調用System.gc(),我會認爲你的分配失敗了,系統正在嘗試做一個gc。

所以,是的,你應該認真考慮重新使用一些巨大的物體,而不是每次分配它們。這是一個更好的做法,但如果出於某種原因無法做到這一點,則可能會影響堆大小(通過設置大堆),這可能會有所幫助。

2

有時候,當你有一個永無止境的循環時,只是因爲某些條件總是如此。

試着找出它的這種情況是否首先發生,主要是因爲這一點。