在用Java开始游戏之前等待GC完成?

时间:2012-01-06 00:05:15

标签: java android performance garbage-collection

我正在制作快节奏的实时 Android游戏,一切都运行良好,但游戏开始的前几秒非常滞后,因为垃圾收集器在加载后正在清理线。当然,玩家可以等几秒钟(比如10秒以上),因为它完成后会开始非常流畅,但看起来真的很难看,感觉就像游戏有问题。

有没有办法(或技术)告诉它何时可以安全地开始游戏,这样垃圾收集器一旦实时部分开始就不会开始疯狂?没有破坏东西,大胖子装载线程不能减少很多。

3 个答案:

答案 0 :(得分:3)

这似乎是System.gc()可能有帮助的情况。它告诉系统这是收集垃圾的好时机。根据文件,

  

当控制从方法调用返回时,Java虚拟机已尽最大努力从所有丢弃的对象中回收空间。

然而,文档还说,该方法“建议”收集对象 - 也就是说,不能保证它会有所帮助,特别是如果你仍然有一些参考资料被捕获。如果它确实有效,它将只收集运行代码中无法访问的对象,包括运行时。 (例如,那个加载程序线程没有资格进行收集,直到它完成运行并且你的代码没有更多的引用它。)

答案 1 :(得分:1)

您可以在开始游戏之前运行System.gc()以手动强制垃圾收集器运行(至少根据官方JavaDoc here,在从此方法调用返回之前完成)。但是,GC通常是不确定的,并且无法保证它不会再次运行,或者就此而言,对System.gc()的调用将会做任何事情。

答案 2 :(得分:1)

如果你更深入地研究这个问题,你可能会发现很多(甚至是大多数)“懒散”不是GC的错。我怀疑它主要是由于JIT编译。调用System.gc()可以改善一些事情,但我怀疑它会彻底消除这种迟缓。