2013-04-03 58 views
15

我有我的目錄下載下面的消息,瞭解Android的GC消息

GC_CONCURRENT freed 456K, 19% free 2753K/3360K, paused 5ms+9ms, total 378ms 

我試圖使最後總價值感。我已經在網站上檢查了其他與GC有關的問題,他們或者有兩個與併發GC相關的暫停或者一個非併發GC的總暫停。爲什麼我有兩個?我的應用暫停了5 + 9毫秒或378毫秒?總數是多少?

+0

可能的重複[什麼是GC \ _FOR \ _MALLOC,GC \ _EXPLICIT和其他GC \ _ * *在Android Logcat中的含義?](http://stackoverflow.com/questions/4976566/what-do-gc -for-malloc -gc -external-and-other-gc-mean-in-android-logcat) – ForceMagic

回答

1

看看這個question它解釋了垃圾收集信息等
如果您需要更多的信息,看這個video從谷歌內存管理

+1

正如我在我的問題上所說的,我已經檢查了網站上的類似問題。您鏈接的問題仍然不能回答我的問題。應用程序暫停了378毫秒嗎?所有的答案都假設我有兩個單一的時間值。我也瞭解視頻並觀看了它。 –

0

http://www.youtube.com/watch?v=_CruQY55HOk

大約17分鐘左右觀看視頻。這傢伙詳細解釋了logcat消息。

GC_CONCURRENT freed 456K, 19% free 2753K/3360K, paused 5ms+9ms, total 378ms 
GC_CONCURRENT : Jumps in because Heap is growing 
19% free 2753K/3360K After this collection 19% of memory is free. Check the heap usage.paused 5ms+9ms Time taken to collect garbage. Total pause time is 378ms. 
+1

我對視頻有所瞭解,它解釋了我已經知道的「暫停的5ms + 9ms」部分,但不包括總共378部分。沒有解釋總時間的文檔中的哪個部分。 –

+0

378ms是總暫停時間 – Raghunandan

+0

有沒有參考?視頻或文檔不會觸及該視頻。 –

5

GC_CONCURRENT:當堆增長時觸發。因此,它可以及時回收內存,因此堆並不需要放大

GC_CONCURRENT釋放456K

這部分告訴你多少內存被這個GC釋放掃

GC_CONCURRENT釋放456K,19 %免費2753K/3360K

這部分講述堆的空閒百分比,活動對象的大小以及堆的總大小。所以在上面的例子中,免費使用19%,使用2753K的內存,總堆大小爲3360K。

日誌的最後部分告訴你GC花了多長時間。在GC_CONCURRENT集合上,您將看到2次。一個在收集開始時,另一個在結束時。

對於n併發GC事件,只有一個暫停時間,它通常要大得多。例如。暫停378ms

來源:

https://sites.google.com/site/pyximanew/blog/androidunderstandingddmslogcatmemoryoutputmessages

裏的東西都解釋清楚的另一個地方......

http://www.youtube.com/watch?v=_CruQY55HOk

+4

我知道所有這些,你的來源不解決這個問題。我有三個時間值不是兩個我知道暫停5ms + 9ms這個部分是什麼意思,但究竟是什麼總數? –

6

還沒有一個明確的答案,但是從我get,GC_CONCURRENT是一個垃圾收集器,它運行在一個單獨的線程中。這意味着雖然它可能總共需要X毫秒(在你的情況下)運行,但實際運行的線程不會被阻塞很長時間。它只會在併發垃圾收集過程的開始和結束時被阻塞(在你的例子中5 + 9 = 14ms)

這種類型的垃圾收集是由JVM自動觸發的,當它決定它這是一個很好的時間(通常當這堆堆的危險性增加時)。其他類型的GC,如GC_EXPLICIT(如果我沒有誤解該名稱)會在您執行

系統時觸發。GC();

在您的代碼中。對於這種類型的垃圾收集,它只會報告一次(如Y ms),在這種情況下,您的線程實際上會在該時間段內被阻塞,直到完成此類GC過程。

2

從看一些我認爲總共(378毫秒)的systraces並不能反映GC實際上暫停了你的應用程序的時間。它確實反映了垃圾收集所花費的時間。暫停的時間是你應該看的。