2012-03-23 42 views
1

我有一個動畫遊戲,一般每秒鐘可以達到25-30幀,但偶爾會在這裏和那裏凍結四分之一秒。從看各種職位,我想它可能是做一些垃圾收集。診斷垃圾收集(或其他類型的中斷)

我使用的是日食,並配備了DDMS和內部分析器 - 但我還沒有完全掌握。但據我所知,似乎很少且很少發生內存分配,而那些內存似乎很小。同樣,當查看功能列表和他們正在使用的時間百分比時,我看不出什麼奇怪的東西。請注意,我不太清楚要查找什麼 - 是否有一個名爲DoingGarbageCollectionNow()或類似的函數?我找不到像這樣的東西。

編輯:在我的三星Galaxy Y(Android 2.3.5)上,這個小小的死機顯然很明顯。在我的谷歌Nexus S(Android 2.3.3)上,幀速率始終在25以上。

編輯:延遲可能是由另一個應用程序(或操作系統程序)在後臺運行引起的 - 如果是這樣,我怎麼能告訴?

+0

不幸的是,在java世界中,你現在無法真正強制進行垃圾回收。它是運行時(JVM)的責任。 – kosa 2012-03-23 15:20:09

+0

我並不是說有一個函數可以調用 - 我的意思是有一個函數,我可以在分析器報告中看到。 – Mick 2012-03-23 15:22:51

回答

0

我還沒有在android上寫過專門的,但一般你想在日誌中檢查gc來查看它的行爲和時間。

查看本文適用於Android的特定gc logging信息。 http://www.infectentertainment.com/2010/05/28/android-garbage-collection/

平臺不可知的解決方案可能是在平臺上查看並行gc或其他gc類型。 「Gingerbread中引入的併發收集器有助於」Source:http://developer.android.com/guide/practices/design/performance.html

更好的解決方案仍然是通過檢查循環中對象的創建並消除它們來避免實例化。

0

我在我的應用程序中遇到了這個問題,我終於將它追蹤到在數組上使用.clone()方法。據推測,在android/ddms中存在一個bug,其中由clone方法創建的分配不會顯示在分配跟蹤器中。所以你會看到頻繁的垃圾收集,即使你沒有看到任何分配(非常令人沮喪!)

請參閱Garbage collector in Android is running, but nothing is shown as being allocated in ddms' allocation tracker瞭解更多信息。