2011-06-21 97 views
6

我正在測試Dalvik虛擬機,想知道是否有任何工具可以分析dalvik中的垃圾收集。我知道分配跟蹤器,但我正在尋找更詳細的東西。dalvik的垃圾收集工具

+0

我認爲DDMS會幫助你。 –

+0

你想解決什麼問題? –

+0

我在設備上運行後臺服務,該服務嗅探網絡流量並充當設備上其他網絡應用的代理。我的問題是垃圾收集器突然花費比正常執行更長的時間。這會導致後臺服務停滯,進而導致應用程序的Web響應緩慢。我試圖研究垃圾收集器的這種突然的行爲。 – 22kar

回答

0

得到一個日誌中的所有GC操作一段時間:

每次GC發生時,你在你的logcat的一條線。

08-08 16:42:21.998: D/dalvikvm(26942): GC_CONCURRENT freed 773K, 26% free 4739K/6368K, paused 4ms+3ms, total 92ms 
08-08 16:42:21.998: D/dalvikvm(26942): WAIT_FOR_CONCURRENT_GC blocked 11ms 

看來我得到了我的設備上的所有應用程序的那些。

這一行包括很多關於GC的有趣統計數據,例如釋放的內存量,GC佔用的時間,準確發生時間以及堆的大小(使用/總數)。

由於所有這些日誌行都有標籤dalvikvm,因此您應該能夠收集並過濾很長一段時間,並進行分析以瞭解GC行爲。

分析的氣相色譜的具體運行:

如果要分析一個特定的GC運行會發生什麼,這個職位的最佳工具是Eclipse的MAT。 Eclipse MAT可以解析堆轉儲。採取堆快照,等待GC(或使用DDMS自己觸發它),然後拍攝另一個快照。

Eclipse MAT可以顯示兩個快照之間的增量。注意你會看到新的分配和GC引起的釋放。有關比較快照的更多信息是​​。

一些其他的想法:

我不知道你有多少能夠從分析GC過程中學習。 GC的內部工作是一個實現細節。它可以在OS版本/設備/配置之間更改,恕不另行通知。

我在想方法來改善您遇到的GC延遲..在我看來,GC通常在內存條件較低時運行。這可能發生在新分配期間,因此GC可能在您的服務處於活動狀態時運行。也許,如果您手動使用GC服務對GC無效的時間,則可以減少響應Web請求的關鍵路徑中發生的GC數量。爲了嘗試這一點,我會添加一個簡單的後臺計時器,並在我的服務變爲活動狀態時重置它(新請求)。當計時器打勾(在一段時間內不活動)時,我會手動運行System.gc()