诊断垃圾收集(或其他类型的中断)

时间:2012-03-23 15:15:06

标签: java android eclipse

我有一个动画游戏,通常每秒可以达到25-30帧,但偶尔会在此处和那里冻结四分之一秒。通过查看各种帖子,我猜它可能正在做一些垃圾收集。

我正在使用eclipse并且配备了DDMS和内部分析器 - 我还没有完全掌握它。但据我所知,似乎很少和不经常的内存分配正在进行,并且那些似乎非常小。另外,当查看功能列表以及它们占用的时间百分比时,我看不出有什么奇怪的。请注意,我不太清楚要查找的内容 - 是否有一个名为DoingGarbageCollectionNow()的函数或者我应该在列表中看到的类似函数?我找不到类似的东西。

编辑:我的三星Galaxy Y(Android 2.3.5)上的小冻结只会显而易见。在我的Google Nexus S(Android 2.3.3)上,整个帧速率为25或更高。

编辑:延迟甚至可能是由在后台运行的其他应用(或操作系统程序)引起的 - 如果是这样,我该怎么说?

2 个答案:

答案 0 :(得分:0)

我没有专门写过android,但一般来说你想在日志中检查gc以查看它的行为和时间。

有关Android特定的gc日志信息,请参阅此文章。 http://www.infectentertainment.com/2010/05/28/android-garbage-collection/

平台无关解决方案可能是在平台上查看并行gc或其他gc类型(如果可能)。 “姜饼中引入的并发收集器有助于[...]”来源:http://developer.android.com/guide/practices/design/performance.html

更好的解决方案仍然是尽可能通过检查循环中对象的创建并消除它们来避免实例化。

答案 1 :(得分:0)

我在我的应用程序中遇到此问题,最后我将其跟踪到在数组上使用.clone()方法。据推测,android / ddms中存在一个错误,即克隆方法创建的分配不会出现在分配跟踪器中。所以你会看到频繁的垃圾收集,即使你没有看到任何分配(非常令人沮丧!)

有关详情,请参阅Garbage collector in Android is running, but nothing is shown as being allocated in ddms' allocation tracker