JVM堆内存介绍
堆内存
服务器JVM默认的初始化和最大堆内存是物理内存的四分之一。比如服务器内存是16g,则默认的最大堆内存是4g。
可以通过 JVM 启动参数-Xms(初始化堆大小)和-Xmx(最大堆大小)来指定初始化堆大小和最大堆大小。
年轻代大小
默认情况下,年轻代大小由参数NewRatio控制(服务器JVM默认配置为2)。设置-XX:NewRatio=3意味着年轻代和老年代之间的比率为1:3。换句话说,伊甸园空间和幸存者空间的总大小将是堆总大小的四分之一。
年轻代的最大大小将根据总堆的最大大小和NewRatio参数的值来计算。
幸存者空间
幸存者空间有2个,采用标志复制算法回收。服务器JVM默认配置大小为年轻一代的八分之一,也就是说Survivor1:Survivor2:eden =1:1:8
年轻代、老年代、Eden、survivor区占比

示例
下图是启动一个Java程序,无逻辑代码,设置JVM启动参数为:-Xms30M -Xmx30M
通过jmc查看内存,可以看到老年代内存为20M、伊甸区为8M、幸存者区之一为1M

参数说明
| 参数 | 说明 | 默认值 |
|---|---|---|
| -XX:InitialHeapSize | 初始化堆内存,通过-Xms 设置 | 系统内存1/64 |
| -XX:MaxHeapSize | 最大堆内存,通过-Xmx 设置 | 系统内存四分之一 |
| -XX:OldSize | 老年代内存大小 | 默认为堆内存的三分之二 |
| -XX:NewSize | 新生代内存大小 | 默认为堆内存的三分之一 |
| -XX:MaxMetaspaceSize | 元空间的最大值 | 默认为-1,即不受限制,或者说受限于本地内存 |
| -XX:MetaspaceSize | 元空间初始化大小 | 取决于平台,范围从 12 MB 到大约 20 MB。 |
堆空间大小怎么配置
| 空间 | 说明 |
|---|---|
| 总大小 | 3~4倍活跃数据大小 |
| 新生代 | 1~1.5倍活跃数据大小 |
| 老年代 | 2~倍活跃数据大小 |
| 永久代/元空间 | 1.2~1.5倍Full GC后的永久代空间大小 |
参考链接
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html#sthref30

浙公网安备 33010602011771号