2009-05-01 63 views
12

我正在將遊戲移植到Android(有很多代碼,很少是我的),而DalvikVM告訴我(通過LogCat)所有關於垃圾收集的內容。在代碼中的某個時候,我得到了一個「GC釋放x對象/ x ms」消息的流,基本上告訴我,大約有150,000個對象被刪除了,並且耗時一秒鐘。Android:創建對象的軌跡數

我想知道這些來自哪裏!我很確定我沒有故意創造那麼多物品。

那麼,有沒有辦法讓...基本上與該消息相反?什麼東西打印日誌消息時,任何對象是創建

這樣我可以跨越代碼,檢查生成了多少消息,並查看代碼的哪些部分正在生成對象。我懷疑在循環的一部分中創建了某種形式的對象,但如果可能的話,這將是一個很容易確定的方法。

我正在使用Eclipse 3.4.2,如果這是相關的。

任何想法?

+0

當你創建一個對象的新實例時,你不能記錄消息嗎? – 2009-05-01 00:58:36

+0

嗯,是的,但我想在創建_any_對象時記錄消息。就像,甚至Rects或Strings或...任何東西。 – mcccclean 2009-05-01 01:06:11

回答

3

爲什麼不介紹Sun JVM上的現有遊戲代碼(假設您正在移植Java遊戲)?然後你可以利用JProfiler,Yourkit等,看看有多大的對象正在清理。 (使用-XX:+ PrintGCDetails查看GC運行以查找它的時間。)

如果事實證明不在遊戲中,您已經非常無痛地計算出了這一點,然後可以將注意力轉向您的注意力到您的Android代碼。不幸的是,我不太瞭解。

8

這可以使用Android自帶的ddms工具(不是Eclipse版本)。使用它,查看分配跟蹤器選項卡。您可以開始跟蹤所有對象的分配以及它們分配的位置的堆棧跟蹤。然而,這個工具可以產生一個信息圖,你想要的特定信息並不總是很容易解析或找到。如果您有Sun JVM的版本,我會推薦使用Kai提到的工具,它們更加發達。如果您必須在Android中執行此操作,那麼使用分配跟蹤器將爲您提供一個開始。