java - Java 自动堆增加 "transparent"还是有成本?

标签 java garbage-collection heap-memory

是否最好将 -Xms<> 参数设置为 JVM 的预期内存,还是将其保留为自动更好?我的意思是,如果我知道我的应用程序将使用至少 500MB 的 RAM 和最大 1GB(使用随机数),将参数设置为 JVM 会更好吗?我知道如果你有一个更大的堆,结果是你有更长的等待时间,但如果堆几乎完成,JVM 是否应该重新定位占用的内存(失去宝贵的时间)?

最佳答案

堆扩展的过程确实会影响性能。但是,效果取决于您所谈论的性能类型。

一个性能标准是花费在“垃圾收集”上的处理器时间百分比;即“吞吐量”。针对吞吐量进行优化的 GC 往往最适合大堆。因此,在这种情况下,一个简单的分析表明,您最好将堆预分配到您预期需要的大小……而不是从小处着手并依赖 GC 来扩展堆。

另一个性能标准是暂停时间。然而,“低暂停”收集器的行为对于上面的简单分析风格来说太复杂了。 (而且我不知道它在实践中通常是如何工作的......)


有一个方面适用于所有方面。假设应用程序的堆使用率达到(大致)稳定状态,并假设它在 JVM 生命周期的早期就达到了该状态,那么达到该稳定状态所涉及的各种性能开销(即应用程序的“预热”开销) 将趋于微不足道。

关于java - Java 自动堆增加 "transparent"还是有成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20585458/

相关文章:

java - 这段代码如何生成该十六进制值?

java - 使用 Camera API 制作适用于所有设备的 android 相机应用程序

java - 后续: G1 Collector not doing full GC

java - 调用 `System.gc()` 是管理 Java 应用程序内存的好方法吗?

java - 哪个进入堆栈或堆?

c - GDB和汇编: how to examine consts variables defined in heap?

java - 如何在java中排队并调用实际方法(而不是立即评估)?

Python 列表追加慢?

java - java中使用的峰值内存和最大内存有什么区别?

java - 为什么我的所有页面数据都显示 StaleElementReferenceException