一、JVM堆内存结构图
从图上可知,JVM堆内存大体分为两类:新生代、老年代
1.1 新生代内存
新生代内存又可以划分为两个区域:Eden区、Survivor区;
Survivor区又可以划分两个区域:From区、To区,并且这两个区占得内存比是1:1
1.1.1 特性(默认配置下)
- Eden区和From区默认比例是8:1
- From区和To区比例一定是1:1
1.2 老年代内存
- 新生代和老年代默认比是1:2
结论
- Eden区:Survivor区:Old区 = 4:1:10
- Eden区:From区:To区:Old区=8:1:1:20
二、JVM方法区内存结构
方法区的内存结构相对比较简单:class space
和 non-class space
class space
:存储如类名、方法入口等等,其内存在默认配置下会被初始化为1G,但是默认没有上限。non-class space
:存储类的注解、类的字节码源信息等
三、JIT缓存内存结构
JIT内存结构受-XX:ReservedCodeCacheSize
参数影响,当参数>=240m
就会产生三块空间,当参数<240m
则只有一个空间
四、JVM内存配置参数
- Xss=1m:表示JVM每个线程所占用的最大内存(计数器、JVM虚拟机栈、本地方法栈之和),Linux64位操作系统下,默认值就是1Mb
- -Xmx1024m: 表示JVM内存最大是1024M;
- -Xms1024m:表示JVM内存最小是1024M;
- -Xmn200m:表示新生代内存是200M,则剩下的内存就是老年代;
- -XX:SurvivorRadio=3:表示Eden区/From区的比值是3,所以如果Eden区内存是200Mb,则From区内存就是200/3=67Mb,Survivor区内存就是200 / 3 * 2 = 133Mb
- -XX:NewRatio=2:1:表示老年代和新生代的内存比值是2:1
- -XX:MaxNewSize=100Mb:表示设置新生代的最大内存值是100Mb
- -XX:NewSize=100Mb:表示设置新生代的最小内存是100Mb
- -XX:CompressedClassSpaceSize=100Mb:表示设置JVM方法区
class space
的最大内存大小 - -XX:MaxMatespace=2048m:表示设置元空间(JDK8之后方法区的叫法)的最大内存为2G。
- -XX:ReservedCodeCacheSize=240m:控制JIT即时编译器的缓存空间最大为240Mb
建议生产环境将JVM内存最大值和最小值设置为相同值,避免内存扩容带来的性能损耗