我正在开发一个时间紧迫的应用程序,每次迭代的时间上限为 40 毫秒。如果仅超过一次时间上限,则应用程序终止并结束游戏。应用程序本身保持在 40 毫秒以下没有问题,有时是垃圾收集器超过了限制。
使用对象池与工厂模式相结合,我设法在很大程度上消除了垃圾收集的需要,并且应用程序实现了稳定的 17 毫秒迭代时间,包括小型 GC 运行,除了应用程序启动后的 10 到 20 次迭代仅一次完整 GC发生超过 40 毫秒并终止我的应用程序。
我的问题是,我如何分析究竟是什么导致了这个完整的 GC?我大量使用 jvisualvm 来分析我的运行时和内存占用情况,这对识别我需要缓存的对象很有帮助。但在这种特殊情况下,我不能使用它,因为在我按下 jvisualvm 中的正确按钮之前很久就会发生完整的 GC。有没有办法以编程方式生成堆转储?