2011-06-26 41 views
3

Android中是否有「活」內存分析器工具(與XCode中的Instruments類似)?大多數內存分析搜索引導我使用內存分析工具(這非常棒),但是我非常感謝能夠動態顯示哪些類在我的應用程序的生命週期中消耗(釋放)內存的工具,因爲它正在執行。適用於Android的「Live」內存分析工具

注意:我是而不是正在尋找適用於Android的內存分析工具(內存分析工具對我非常適用)。我遇到的所有方法/工具都會拍攝堆的快照並將其保存到文件中。我正在尋找一種工具,它提供了一個實時計數器/更新各個對象正在使用的堆的哪部分,並在第二/秒的基礎上更新。這可能是Android可能無法實現的。但是,我還沒有找到明確的答案。

+1

DDMS提供堆和分配跟蹤器 - 這些和MAT幾乎是我所能找到的。請更新你的帖子,你發現比這更好的東西。 – Asahi

+0

看到我的答案在這http://stackoverflow.com/questions/9565453/android-memory-analysis/9679360#9679360 – Sameer

回答

1

看看這個視頻here在大約35分鐘,他們展示瞭如何描述你的應用,不知道你是否可以做'活'壽。


更多信息from this post on milk.com

有沒有因爲試過這個Android 1.6及不知道你是否能做到這一點的生活,但用於能夠通過生成堆數據:

得到一個設備上的命令shell:

$ adb shell 

您可以驗證是否正在運行與id命令根。響應應該看起來像uid = 0(root)gid = 0(root)。如果不是,請輸入su並重試。如果su失敗了,那麼你運氣不好。

接下來,確保目標目錄存在:

# mkdir /data/misc 
# chmod 777 /data/misc 

用PS或DDMS來確定應用程序的進程ID,然後發送一個SIGUSR1到目標進程:

# kill -10 <pid> 

信號導致GC,然後是堆轉儲(要完全準確,它們實際上是同時發生的,但堆轉儲中的結果反映了GC後狀態)。這可能需要幾秒鐘的時間,所以您必須注意GC日誌消息以瞭解它何時完成。

下一頁:

# ls /data/misc/heap-dump* 
# exit 

使用ls來檢查文件名,然後退出,退出設備命令shell。

您應該看到兩個名爲/data/misc/heap-dump-BLAH-BLAH.hprof和.hprof-head的輸出文件,其中BLAH是一個運行時生成的值,可確保文件名是唯一的。拉他們關閉設備,並刪除該設備端副本:

$ adb pull /data/misc/heap-dump-BLAH-BLAH.hprof tail.hprof 
$ adb pull /data/misc/heap-dump-BLAH-BLAH.hprof-head head.hprof 
$ adb shell rm /data/misc/heap-dump-BLAH-BLAH.hprof /data/misc/heap-dump-BLAH-BLAH.hprof-head 

合併在一起,並刪除中間體:

$ cat head.hprof tail.hprof > dump.hprof 
$ rm head.hprof tail.hprof 

你現在有dump.hprof的HPROF轉儲。

數據文件格式從常用的hprof格式略有增加,並且由於許可限制,修改後的hat工具無法分發。轉換工具hprof-conv可用於從輸出中去除特定於Android的部分。這個工具最初被包含在1.5中,但可以與老版本的Android一起使用。

轉換的輸出應該可以與任何hprof數據分析器一起工作,包括jhat,它可以在Sun JDK和Eclipse MAT中免費獲得。

+0

他們演示了內存分析工具(我已經在我的帖子中提到過)。該工具獲取當前堆使用情況的快照。我正在尋找一些讓我在使用應用程序時能夠看到堆的運行視圖。 – sparkymat

+0

已編輯的答案顯示我如何獲取堆數據 - 自從android 1.6以來沒有做到這一點,並不確定它是否適合你,但可能會有所幫助! – Kenny

+0

感謝您的詳細評論,但正如我在之前的評論中提到的,我並不想獲取當前堆分配的靜態快照。我正在尋找一個動態的「實時」視圖,該視圖在應用程序正在使用時不斷更新。也許這是不可能的,但我想確定。 – sparkymat