【发布时间】:2014-01-16 14:04:00
【问题描述】:
JVM 应用程序在 Oracle Hotspot JVM 上运行,它以默认 JVM 设置启动,但初始堆大小为 100MB,最大堆大小为 1GB。
在什么情况下 JVM 会决定增加当前堆大小,而不是尝试 GC?
【问题讨论】:
标签: java performance jvm jvm-hotspot
JVM 应用程序在 Oracle Hotspot JVM 上运行,它以默认 JVM 设置启动,但初始堆大小为 100MB,最大堆大小为 1GB。
在什么情况下 JVM 会决定增加当前堆大小,而不是尝试 GC?
【问题讨论】:
标签: java performance jvm jvm-hotspot
HotSpot JVM 持续监控分配率和对象生命周期。它试图实现两个关键因素:
简而言之,您可以将其描述为 HotSpot 具有一些配置的阈值,该阈值指示在运行垃圾收集器后空闲的总分配堆的百分比。例如,如果此阈值配置为 70%,并且在运行完整 GC 后堆使用率为 80%,则将分配额外的内存以达到阈值。当然,更大的堆意味着更长的暂停时间,而更小的堆意味着更频繁的收集。
但您必须记住 JVM 非常复杂,您可以更改这种行为,例如使用标志:
AdaptiveSizePausePolicy,它将选择堆大小以实现最短暂停AdaptiveSizeThroughPutPolicy,它将选择堆大小以实现最高吞吐量GCTimeLimit 和 GCTimeRatio,设置应用程序执行所花费的时间【讨论】:
占用Heap 的对象数量增加,而无法进行垃圾回收。
当对象由于当前进程使用而无法作为垃圾收集时,JVM 需要将其堆大小增加到允许创建新对象的最大值。
【讨论】: