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