簡體   English   中英

如何分析Dalvik GC的行為?

[英]How to analyse Dalvik GC behaviour?

我正在Android上開發應用程序。 這是一個長期運行的應用程序,可連續處理傳感器數據。 在運行該應用程序時,我在logcat中看到很多GC消息。 大約每秒一。

這很可能是因為對象被創建並立即在循環中取消引用。

如何找到要立即創建和釋放的對象?

我嘗試過的所有Java堆分析工具(*)都被堆上對象的數量和大小所困擾。 盡管它們很有用,但我更感興趣的是找出創建 臨時 短暫對象最多的站點。

(*)我嘗試了jcatEclipse MAT 我不能讓hat在Android堆轉儲工作; 它抱怨不支持的轉儲文件版本。

如何找到要立即創建和釋放的對象?

步驟#1:臨時修改代碼(或使用代碼的相關部分創建剪貼項目),您可以在其中單擊按鈕或執行某種操作,以完全通過傳感器處理邏輯運行一次。

步驟2:進入DDMS(獨立或Eclipse透視圖)。

步驟#3:選擇您的模擬器,然后單擊分配跟蹤器選項卡

步驟4:將您的應用程序移至等待步驟1中單擊按鈕的位置,然后在DDMS分配跟蹤器選項卡中單擊開始跟蹤。

步驟#4:單擊按鈕,並在傳感器處理通過完成后,單擊DDMS分配跟蹤器選項卡上的獲取分配。

這將告訴您在那部分代碼中分配了什么。 它不會告訴您“釋放”了什么,因為在GC循環運行之前這是不確定的。

編輯

我不確定,但是android.os.Debug類上的startAllocCounting()可能與單擊“開始跟蹤”按鈕具有相同的效果。 如果是這樣,您可以簡單地檢測代碼以在循環的一遍中跟蹤分配,而不用搞亂我上面概述的代碼更改。

而且,FWIW, 這是一篇有關DDMS和分配跟蹤的簡短技術文章

我認為您需要嘗試一下分配跟蹤器:)

(在您的/ tools目錄中)

http://developer.android.com/resources/articles/track-mem.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM