【问题标题】:Under which circumstance will JVM decide to grow size of heap?JVM在什么情况下会决定增加堆的大小?
【发布时间】:2014-01-16 14:04:00
【问题描述】:

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

在什么情况下 JVM 会决定增加当前堆大小,而不是尝试 GC?

【问题讨论】:

    标签: java performance jvm jvm-hotspot


    【解决方案1】:

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

    1. 让短命的对象死在伊甸园里
    2. 促进长寿命对象按时堆,以防止在幸存者空间之间进行不必要的复制

    简而言之,您可以将其描述为 HotSpot 具有一些配置的阈值,该阈值指示在运行垃圾收集器后空闲的总分配堆的百分比。例如,如果此阈值配置为 70%,并且在运行完整 GC 后堆使用率为 80%,则将分配额外的内存以达到阈值。当然,更大的堆意味着更长的暂停时间,而更小的堆意味着更频繁的收集。

    但您必须记住 JVM 非常复杂,您可以更改这种行为,例如使用标志:

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

    【讨论】:

      【解决方案2】:

      占用Heap 的对象数量增加,而无法进行垃圾回收。

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

      【讨论】:

      • 一点也不明显……它可以运行 GC 代替。它也不会等到堆的最后一个字节是强可达的。
      猜你喜欢
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 2012-04-04
      • 2019-12-23
      • 2012-05-24
      • 2011-07-24
      相关资源
      最近更新 更多