是否最好将 -Xms<> 参数设置为 JVM 的预期内存,还是将其保留为自动更好?我的意思是,如果我知道我的应用程序将使用至少 500MB 的 RAM 和最大 1GB(使用随机数),将参数设置为 JVM 会更好吗?我知道如果你有一个更大的堆,结果是你有更长的等待时间,但如果堆几乎完成,JVM 是否应该重新定位占用的内存(失去宝贵的时间)?
最佳答案
堆扩展的过程确实会影响性能。但是,效果取决于您所谈论的性能类型。
一个性能标准是花费在“垃圾收集”上的处理器时间百分比;即“吞吐量”。针对吞吐量进行优化的 GC 往往最适合大堆。因此,在这种情况下,一个简单的分析表明,您最好将堆预分配到您预期需要的大小……而不是从小处着手并依赖 GC 来扩展堆。
另一个性能标准是暂停时间。然而,“低暂停”收集器的行为对于上面的简单分析风格来说太复杂了。 (而且我不知道它在实践中通常是如何工作的......)
有一个方面适用于所有方面。假设应用程序的堆使用率达到(大致)稳定状态,并假设它在 JVM 生命周期的早期就达到了该状态,那么达到该稳定状态所涉及的各种性能开销(即应用程序的“预热”开销) 将趋于微不足道。
关于java - Java 自动堆增加 "transparent"还是有成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20585458/