新生代
eden
survivor
from survivor
to survivor
新生代分配规则
当创建一个对象时,对象会被优先分配到新生代的 Eden 区<br>
此时 JVM 会给对象定义一个对象年轻计数器(-XX:MaxTenuringThreshold)
当 Eden 空间不足时,JVM 将执行新生代的垃圾回收(Minor GC),JVM 会把存活的对象转移到 Survivor 中,并且对象年龄 +1,对象在 Survivor 中同样也会经历 Minor GC,每经历一次 Minor GC,对象年龄都会+1
新生代:Minor GC回收规则
eden->from survivor->to survivor->from survivor->to survivor...
默认是15 次回收标记后去老年代
老年代
分配规则
大对象直接进入老年代
避免在 Eden 区和两个Survivor 区之间发生大量的内存拷贝
如果分配的对象<b>超过了-XX:PetenureSizeThreshold设置的大小</b>,对象跳过新生代和新生代gc会直接被分配到老年代
旧的一代内存包含那些经过许多轮小型 GC 后仍然存活的对象
老年代:Major GC回收规则
内存不足后进行Major GC
Major GC 之后发现依然无法进行对象的保存,就会产生 OOM 异常
分类参数
<span style="color: rgb(44, 62, 80); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; font-size: 14.88px;">默认情况下新生代和老年代的比例是 1:2,可以通过 </span><code style="font-family: var(--font-family-code); color: var(--c-text-lighter); padding: 0.25rem 0.5rem; margin: 0px; font-size: 0.85em; background-color: var(--c-bg-lighter); border-radius: 3px; overflow-wrap: break-word; transition: background-color var(--t-color);">–XX:NewRatio</code><span style="color: rgb(44, 62, 80); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; font-size: 14.88px;"> 来配置</span>
新生代中的 Eden:From Survivor:To Survivor 的比例是 8:1:1,可以通过 -XX:SurvivorRatio 来配置
JDK 8 是默认开启-XX:+UseAdaptiveSizePolicy,会动态调整 JVM 堆中各个区域的大小以及进入老年代的年龄,开启后每次 GC 后都会重新计算 Eden、From Survivor、To Survivor 的大小,计算依据是GC过程中统计的GC时间、吞吐量、内存占用量; –XX:NewRatio会失效;