Java 如何预测jvm垃圾收集

Java 如何预测jvm垃圾收集,java,performance,garbage-collection,prediction,Java,Performance,Garbage Collection,Prediction,我正在开发一个用java编写的关键应用程序,它应该可以避免“停止世界垃圾收集”的影响。 我正在寻找一种解决方案,可以预测由于完全gc而导致的长时间暂停。有可能吗?您可以做的最好的事情是减少分配和/或使用类似Azul的无暂停GC。这将使地面军事系统更易于管理 如果您在关键部分(使用指标识别,例如JMC/JFR这样的探查器)减少了足够多的分配,您可以全天运行而不需要完整的集合,或者在极端情况下,可以全天运行而不需要较小的集合 您可以监视终身空间的填充情况,并查看是否已填充(导致完全GC的原因还有其他

我正在开发一个用java编写的关键应用程序,它应该可以避免“停止世界垃圾收集”的影响。
我正在寻找一种解决方案,可以预测由于完全gc而导致的长时间暂停。有可能吗?

您可以做的最好的事情是减少分配和/或使用类似Azul的无暂停GC。这将使地面军事系统更易于管理

如果您在关键部分(使用指标识别,例如JMC/JFR这样的探查器)减少了足够多的分配,您可以全天运行而不需要完整的集合,或者在极端情况下,可以全天运行而不需要较小的集合


您可以监视终身空间的填充情况,并查看是否已填充(导致完全GC的原因还有其他,但这是最常见的)

这根本不可能。我认为避免“停止世界”垃圾收集的最好方法是最小化对象的寿命。小跑步


顺便说一句,您需要尝试不同的解决方案并对其进行分析。

为什么不定期强制执行GC,频率取决于内存使用情况等?

如果GC有时是可接受的,您可以尝试调用
System.GC()
。当此调用返回时,新的GC不太可能在不久的将来发生。此问题与统计预测无关,因此“预测”标记可能放错了位置。@Ole V.V.
GC()
很容易发生或被禁用。“不久的将来”是一个无定形的术语,新GC的可能性完全取决于OP系统的具体情况、其运行时配置文件和它的bug,对此我们一无所知。因此,我们还不能负责任地断言
gc()
可能产生的影响。对于延迟敏感的应用程序,常用的方法不是试图预测暂停,而是测量并减少暂停。@LewBloch当然,可以禁用gc,但后来有人禁用了它。这在您自己的服务器上很容易避免。你可以测试它,如果它有效,你可以信赖它。这就是说,变化在于有更好的解决方案。“减少分配”可能会显著降低GC性能,因为人们为减少分配所做的大多数事情都会导致对象一直存活,直到它们被提升为“终身”。这不是一个天真的建议。更好的建议是在算法允许的最窄范围内分配引用,这样年轻一代的GCs就是规则,并且尽可能早地释放对象以避免内存泄漏(打包)。此外,将对象设计为需要最少的初始化。遵循最佳固有程序逻辑以获得最佳GC配置文件。@LewBloch分配对象涉及的工作通常应该避免。理想情况下,转义分析可以消除分配,因此我将避免优化jit可以为您优化的代码,即只在运行时删除实际分配,而不是您认为发生分配的位置。您确实希望避免对象在永久空间中消亡,尽管我很少看到这种情况,尤其是当您可以有很少的小集合时。分配对象几乎不需要时间,可能需要10或12条机器指令。内存系统保证JVM只需存储一个指针,并将堆顶标记向上移动。需要时间的是初始化。我的建议解释了这一点,就像你的建议一样,主张避免让物体到达终身一代。大多数对象都应该早死。@LewBloch分配所产生的内存压力会降低缓存效率并降低每次内存访问的速度,只需减少关键部分的分配,您就可以将应用程序的性能提高2-5倍。@LewBloch我同意,以不集中的方式更改代码可能在性能方面弊大于利,但增加复杂性将使维护变得更加困难。只有优化由指标驱动的代码才有意义,例如jfr这样的探查器。因为你不能提供很好的建议,让年轻一代的GCs占据主导地位,分配几乎免费,释放完全免费,并确保活动对象副本尽可能小。