2012-03-23 36 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了解更多信息。