14

我正在将游戏移植到 Android(有很多代码,而我的代码很少),DalvikVM 正在(通过 LogCat)告诉我所有关于垃圾收集的信息。在代码中的某个时刻,我收到一条“GC 释放 x 个对象 / x 毫秒”消息流,基本上是通知我刚刚删除了大约 150,000 个对象,这需要整整一秒钟。

我想知道这些是从哪里来的!我很确定我不是故意创建那么多对象。

那么,有没有办法得到......基本上与该消息相反?创建任何对象时打印日志消息的东西?

这样我就可以跳过代码,检查生成了多少消息,并查看代码的哪些部分正在生成对象。我怀疑在循环的一部分中创建了某种形式的对象,但如果可能的话,这将是一种确定的简单方法。

我正在使用Eclipse 3.4.2,如果那是相关的。

有任何想法吗?

4

2 回答 2

8

这可以使用 Android 附带的 ddms 工具(不是 Eclipse 版本)。使用它,查看分配跟踪器选项卡。您可以开始跟踪所有对象的分配以及它们分配位置的堆栈跟踪。但是,此工具可以生成大量信息,而您想要的特定信息并不总是易于解析或查找。如果你有 Sun JVM 的版本,我会推荐使用 Kai 提到的工具,它们更发达。如果您必须在 Android 中执行此操作,则使用分配跟踪器将为您提供一个开始。

于 2009-05-03T15:52:33.487 回答
3

为什么不分析 Sun JVM 上的现有游戏代码(假设您正在移植 Java 游戏)?然后,您可以利用 JProfiler、Yourkit 等,查看正在清理哪些庞大的对象集。(使用 -XX:+PrintGCDetails 来查看 GC 运行的时间。)

如果事实证明它不在游戏中,那么您已经很轻松地发现了这一点,然后可以将注意力转移到您的 Android 代码上。不幸的是,我对此知之甚少。

于 2009-05-01T02:35:40.317 回答