在什么情况下JVM决定增加堆的大小?

时间:2014-01-16 14:04:01

标签: java performance jvm jvm-hotspot

JVM应用程序在Oracle Hotspot JVM上运行,它以默认的JVM设置启动,但初始堆大小为100MB,最大堆大小为1GB。

在哪种情况下JVM会决定增加当前的堆大小,而不是尝试使用GC?

2 个答案:

答案 0 :(得分:5)

HotSpot JVM持续监控分配率和对象的生命周期。它试图实现两个关键因素:

  1. 让短命的物品死在伊甸园
  2. 按时提升长寿命对象以防止在幸存者空间之间进行不必要的复制
  3. 简而言之,您可以将其描述为HotSpot具有一些已配置的阈值,该阈值表示在运行垃圾收集器后可以免费释放总分配堆的百分比。例如,如果此阈值配置为70%,并且在运行完整GC堆使用率为80%之后,则将分配额外的内存以达到阈值。当然,更大的堆意味着更长的暂停,而更小的堆意味着更频繁的集合。

    但是你必须记住JVM非常复杂,你可以改变这种行为,例如使用flags:

    • AdaptiveSizePausePolicy,它将选择堆大小以实现最短的暂停
    • AdaptiveSizeThroughPutPolicy,它将选择堆大小以实现最高吞吐量
    • GCTimeLimitGCTimeRatio,用于设置执行应用程序所花费的时间

答案 1 :(得分:0)

无法进行垃圾收集时占用Heap的对象数量增加。

当对象由于当前进程使用而无法收集为垃圾时,JVM需要增加它的堆大小,以允许创建新对象。