目录
- 一、介绍
- 二、设置堆空间大小
- 三、虚拟机栈的设置
- 四、年轻代中 Eden区和两个 Survivor 区的大小比例
- 五、年轻代晋升老年代阈值
- 六、设置垃圾回收器
一、介绍
我们知道 JVM 调优的参数是非常多的,如果想要系统地学习可以参考下面的地址,这里面介绍了所有的 JVM 参数:
- 官方 JVM 参数文档: https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html
但是在一般的项目开发中,我们用不了这么多参数,下面我们就介绍几个常见的参数。后期如果大家有需求,还是需要翻阅官网进一步查看详细的资料。
对于 JVM 调优,主要就是调整年轻代、老年代、元空间的内存空间大小及使用的垃圾回收器类型。
比较常用的 JVM 调优用的参数如下:
- 设置堆空间大小。
- 虚拟机栈的设置。
- 年轻代中 Eden 区和两个 Survivor 区的大小比例。
- 年轻代晋升老年代阈值。
- 设置垃圾回收收集器。
下面我们就来看一下这些 JVM 调优参数的具体设置方法和作用。
二、设置堆空间大小
设置堆空间大小
:设置堆的初始内存和最大内存,为了防止垃圾收集器在初始大小、最大大小之间收缩堆而产生额外的时间,通常把最大、初始大小设置为相同的值。这里主要包括两个参数:
-Xms
:设置堆的初始化内存大小。-Xmx
:设置堆的最大大小。
这两个参数如果不指定单位默认为字节,如果指定单位,按照指定的单位设置。如下所示:
# 设置初始内存大小为 1024B
-Xms:1024
# 设置初始内存大小为 1024KB
-Xms:1024k
# 设置初始内存大小为 1024MB
-Xms:1024m
# 设置初始内存大小为 1GB
-Xms:1g
堆空间大小设置多少合适?
- 最大大小的默认值是物理内存的 1/4,初始大小是物理内存的 1/64。
- 堆太小,可能会频繁的导致年轻代和老年代的垃圾回收,会产生stw,暂停用户线程,这是不合适的。
- 堆太大,内存大肯定是好的,但是存在风险,如果发生了 Full GC,它会扫描整个堆空间,暂停用户线程的时间会特别长,这也是不合适的。
三、虚拟机栈的设置
虚拟机栈的设置
:每个线程默认会开启 1M 的内存,用于存放栈帧、调用参数、局部变量等,但一般 256K 就够用。通常减少每个线程的栈帧,可以产生更多的线程,但这实际上还受限于操作系统。
可以使用 -Xss
堆每个线程栈帧 stack 大小进行调整,如下所示:
-Xss 256k
四、年轻代中 Eden区和两个 Survivor 区的大小比例
设置年轻代中 Eden区和两个 Survivor区的大小比例
:如果不设置,默认比例为 8:1:1,通过增大 Eden区的大小,来减少 Young GC 发生的次数,但有时我们发现,虽然次数减少了,但 Eden区满的时候,由于占用的空间较大,导致释放缓慢,此时 STW 的时间较长,因此需要按照程序情况去调整。
使用示例:
# 表示年轻代中的分配比率:servivor区:eden区 = 2:8,即 Eden区占用了8/10,两个 Survivor区共用占了2/10
-XXSurvivorRatio=8
五、年轻代晋升老年代阈值
年轻代晋升老年代阈值
:假如说当前某一个对象,它在年轻代中挪过来挪过去,挪动次数超过了15次,那么这时候它就会从年轻代中晋升到老年代中,默认为 15 次,取值范围是 0~15。
使用示例:
-XX:MaxTenuringThreshold=15
六、设置垃圾回收器
设置垃圾回收器
:通过增大吞吐量提高系统性能,可以通过设置 G1 垃圾回收收集器。
# JDK8 默认是并行垃圾收集器
-XX:+UseParallelGC
-XX:+UseParallelOldGC
# 设置 G1 垃圾收集器(JDK9默认)
-XX:+UseG1GC
设置过后,我们就可以在项目中使用 G1 垃圾收集器了。
整理完毕,完结撒花~🌻