我正在将游戏移植到Android(有很多代码,而且很少是我的代码),DalvikVM告诉我(通过LogCat)关于垃圾收集的所有内容。在代码中的某个时刻,我得到了一个“GC释放x对象/ x ms”消息流,基本上告诉我~15万个对象刚被删除,并且需要一整秒。
我想知道这些来自哪里!我很确定我并没有故意创造那么多物品。
那么,有没有办法获得...基本上与该消息相反?在创建任何对象时打印日志消息的东西?
这样我就可以跨过代码,检查生成了多少消息,并查看代码的哪些部分正在生成对象。我怀疑在循环的一部分中创建了某种形式的对象,但是如果可能的话,这将是一种简单的方法来确定。
我正在使用Eclipse 3.4.2
,如果这是相关的。
有什么想法吗?
答案 0 :(得分:8)
这可以使用Android附带的ddms工具(不是Eclipse版本)。使用它,查看分配跟踪器选项卡。您可以开始跟踪所有对象的分配以及分配位置的堆栈跟踪。但是,此工具可以生成一个信息,您想要的特定信息并不总是易于解析或查找。如果您有Sun JVM的版本,我建议使用Kai提到的工具,它们更加发达。如果您必须在Android中执行此操作,则使用分配跟踪器将为您提供一个开始。
答案 1 :(得分:3)
为什么不分析Sun JVM上的现有游戏代码(假设您正在移植Java游戏)?然后,您可以利用JProfiler,Yourkit等,并查看正在清理的大量对象集。 (使用-XX:+ PrintGCDetails查看GC运行时间以查找它。)
如果事实证明不在游戏中,那么你可以毫不费力地想出来,然后可以将注意力转移到你的Android代码上。不幸的是,我不太了解。