jvm 性能调优
**************************
项目调优:操作系统、项目架构、程序代码、数据库、jvm调优
操作系统优化:内存、cpu、存储设备等
项目架构优化:为应用程序设计一个合理的架构
程序代码优化:避免一次性加载太多的对象、不要用长生命周期变量引用短周期对象等
数据库优化:为项目设计合理的数据库、表结构
jvm 优化:垃圾收集器以及内存参数设置
说明:jvm 优化之前需要对项目架构、代码等进行优化,如果项目架构或者代码设计存在不足,调整jvm参数对应用的性能提升不大
**************************
jvm 调优评价指标:内存、吞吐量、延时
内存:程序正常运行所需要的内存
吞吐量:应用程序运行时间占总时间(应用程序运行时间+垃圾回收时间)的比值
延时:垃圾回收期间,应用程序的停顿时间
jvm 调优的目标是以较小的内存获得较大的吞吐量或者较低的延时,但这三个目标不可同时实现:
如果设置较大的内存,垃圾回收时就会花费较长的时间,造成较长的延时;
如果设置较低的内存,就会触发频繁的垃圾回收,影响吞吐量
**********************
垃圾收集器:单线程、并行、并发,需要根据应用场景选择合适的垃圾收集器
***************
单线程垃圾收集器:serial(新生代)、serial old(老年代)
特点:垃圾回收时,用户线程停止工作,只有一条垃圾回收线程数
应用场景:适合桌面应用,回收的垃圾几十或者几百兆,垃圾回收造成的停顿时间较短
相关参数
-XX:+UseSerialGC:使用serial + serial old垃圾回收组合
***************
并行垃圾收集器:parallel scavenge(新生代)、parallel old(老年代)
特点:垃圾回收时,用户线程停止,可以有多条垃圾回收线程
应用场景:parallel scavenge是以吞吐量优先的垃圾收集器,提供了参数可以控制最大停顿时间、吞吐量
相关参数
-XX:+UseParallelGC:使用parallel scavenge + parallel old垃圾收集器组合
-XX:+UseParallelOldGC:使用 parallel scavenge + parallel old垃圾收集器组合,该参数java14开始禁用,未来可能移除
Java HotSpot(TM) 64-Bit Server VM warning: Option UseParallelOldGC was deprecated
in version 14.0 and will likely be removed in a future release.
-XX:ParallelGCThreads:设置并发回收线程数
-XX:MaxGCPauseMillis:最大停顿毫秒数,若堆内存过大,垃圾回收时停顿时间可能会超过设置的值
-XX:GCTimeRatio:吞吐量,默认为99,及最大使用1%的时间回收垃圾
-XX:+UseAdaptiveSizePolicy:自动调整新生代大小(-Xmn)、eden与survivor比例(-XX:SurvivorRatio)等参数
***************
并发垃圾收集器:G1(新生代、老年代)
特点:垃圾回收时,用户线程可以工作,只有短暂停顿,可以有多条垃圾回收线程
应用场景:适用于低停顿的场景,与parallel scavenge + parallel old组合相比,G1的停顿时间更可控
相关参数
-XX:+UseG1GC:使用G1垃圾收集器
-XX:+ZGC:使用ZGC垃圾收集器
**********************
内存参数设置:一般情况下,使用默认的参数就可以满足性能要求
***************
常用参数
-Xms:设置堆的最小值
-Xmx:设置堆的最大值
-XX:NewSize:设置新生代最小值
-XX:MaxNewSize:设置新生代最大值
-Xmn:设置新生代大小,等同于将NewSize、MaxNewSize设置为同一个值
-XX:NewRatio:设置新生代、老年代的比值,默认为2(新生代:老年代=1:2)
-XX:SurvivorRatio:设置eden、survivor的比值,默认为8(eden:survivor=8:1)
***************
优化措施
设置合理的初始堆大小,将堆的最大最小值设置为相同,防止堆内存伸缩影响性能;
调整老年代内存大小,避免频繁触发full gc;
调整新生代内存大小,避免频繁触发新生代gc,导致大量对象进入老年代;
使用并行或者并发垃圾收集器进行垃圾收集;
考虑使用高版本的jdk,稳定发布的高版本jdk一般性能较高