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区占比

image

示例

下图是启动一个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

posted @ 2021-05-29 01:06  bakanano  阅读(617)  评论(0)    收藏  举报