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

4
一个JVM应用程序在Oracle Hotspot JVM上运行,它使用默认的JVM设置启动,但初始堆大小为100MB,最大堆大小为1GB。
在什么情况下,JVM会决定增加当前的堆大小,而不是尝试进行垃圾回收?
2个回答

5
HotSpot JVM会持续监控对象的生命周期和分配率,旨在实现两个关键因素:
  1. 让短寿命对象在伊甸园区域中死亡
  2. 及时将长寿命对象提升到堆内存以防止无谓地复制生存区之间的对象
简而言之,可以将其描述为HotSpot具有一些配置的阈值,该阈值指示运行垃圾收集器后多少比例的总分配堆需要为空闲状态。例如,如果此阈值配置为70%并且在运行完整GC后堆使用率为80%,则将分配其他内存以达到该阈值。当然,较大的堆意味着暂停时间更长,而较小的堆意味着更频繁的收集。
但您必须记住JVM非常复杂,您可以通过使用以下标志来更改此行为:
  • AdaptiveSizePausePolicy,该策略将选择堆大小以实现最短暂停时间
  • AdaptiveSizeThroughPutPolicy,该策略将选择堆大小以实现最高吞吐量
  • GCTimeLimitGCTimeRatio,设置应用程序执行所花费的时间

0

在垃圾回收不可能的情况下,占用Heap的对象数量会增加。

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


2
并不是那么明显...它可以运行GC。它也不会等到堆的最后一个字节变得强可达。 - Marko Topolnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接