关于jvm调优:记一次jvm调优及垃圾收集器
本文在第一段先简略解说调优的原因和过程,具体波及到的知识点,在前面段中具体介绍。 1. 调优过程1.1. 问题定位有一天忽然收到监控告警,大批量产线服务实例在主动重启。于是连忙上平台下载dump日志,以及查看其余监控事件,最终定位到问题: 那几分钟内,涌入几十万用户登录平台操作,导致内存吃紧,简直每个实例都触发了几次 Full GC。而因为集中性的 Full GC,STW 工夫过长,服务测活接口长期调不通,k8s断定服务故障,就重启pod。 问题定位了,除了优化代码,缩小有效内存大量占用以外,还能够调优一下Jvm参数了。 1.2. gc 问题定位既然是 gc 出的问题,那就通过 jstat -gcutil pid 时长距离 命令,实时看一下gc的过程状态。 通过一段时间察看,发现每次 young gc 后,survivor 区域中占用比例很高(近百分之百),甚至某些次 old 区域中有稍微增长。这阐明一个问题: young gc 后存活的对象太多,survivor区寄存不下,溢出的对象就间接进入了老年代。这就放慢了老年代内存的占用速度,提前须要 full gc。 gc 的问题也定位到了,接下来分几个步骤优化 1.3. gc 优化分了几个维度: 最直观体现是 survivor 区有余,因而能够加大一下年老代中 survivor 比例,即缩小-XX:SurvivorRatio(eden区和单个survivor区的比例,默认值:8)的值。略微加大一下年老代的占比,即缩小-XX:NewRatio(老年代和年老代的比例,默认值:2)的值。最基本的还是内存不足,所以如果能够,加大xms/xmx。调优垃圾收集器,缩小 full gc 中 stw 的工夫,防止测活接口长时间停机。因为之前是jdk 8默认的(Parallel Scavenge + Parallel Old),换成了更适宜高并发的(ParNew + CMS)。2. jvm命令及参数2.1. jstat -gcutil留神:出于窃密思考,理论的数据不能在文中展现,下列展现的是与上下文无关的服务数据,是比拟失常的 gc 过程数据: [root@xxxapi data]# jstat -gcutil 1 1000 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 50.07 0.00 53.80 13.25 89.91 86.07 1082 21.299 5 2.055 23.354 50.07 0.00 57.11 13.25 89.91 86.07 1082 21.299 5 2.055 23.354 50.07 0.00 62.04 13.25 89.91 86.07 1082 21.299 5 2.055 23.354 50.07 0.00 64.26 13.25 89.91 86.07 1082 21.299 5 2.055 23.354 50.07 0.00 66.61 13.25 89.91 86.07 1082 21.299 5 2.055 23.354 50.07 0.00 69.18 13.25 89.91 86.07 1082 21.299 5 2.055 23.354 50.07 0.00 71.68 13.25 89.91 86.07 1082 21.299 5 2.055 23.354 50.07 0.00 74.75 13.25 89.91 86.07 1082 21.299 5 2.055 23.354 50.07 0.00 77.20 13.25 89.91 86.07 1082 21.299 5 2.055 23.354 50.07 0.00 80.12 13.25 89.91 86.07 1082 21.299 5 2.055 23.354 50.07 0.00 83.09 13.25 89.91 86.07 1082 21.299 5 2.055 23.354 50.07 0.00 87.77 13.25 89.91 86.07 1082 21.299 5 2.055 23.354 50.07 0.00 89.82 13.25 89.91 86.07 1082 21.299 5 2.055 23.354 50.07 0.00 92.29 13.25 89.91 86.07 1082 21.299 5 2.055 23.354 50.07 0.00 94.57 13.25 89.91 86.07 1082 21.299 5 2.055 23.354 50.07 0.00 99.00 13.25 89.91 86.07 1082 21.299 5 2.055 23.354 0.00 74.61 3.38 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 7.88 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 11.46 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 14.93 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 18.23 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 21.29 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 25.22 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 28.74 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 31.64 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 36.85 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 39.30 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 44.76 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 48.55 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 51.25 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 54.17 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 58.48 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 61.99 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 64.52 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 67.25 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 70.92 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 74.60 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 78.43 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 82.41 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 86.26 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 90.79 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 93.74 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 95.90 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 0.00 74.61 99.28 13.25 89.91 86.07 1083 21.325 5 2.055 23.380 51.43 0.00 2.69 13.29 89.91 86.07 1084 21.345 5 2.055 23.400 51.43 0.00 5.53 13.29 89.91 86.07 1084 21.345 5 2.055 23.400 51.43 0.00 8.21 13.29 89.91 86.07 1084 21.345 5 2.055 23.400S0:幸存1区以后应用比例S1:幸存2区以后应用比例E:伊甸园区应用比例O:老年代应用比例M:元数据区应用比例CCS:压缩应用比例YGC:年老代垃圾回收次数YGCT:年老代垃圾回收耗费工夫FGC:老年代垃圾回收次数FGCT:老年代垃圾回收耗费工夫GCT:垃圾回收耗费总工夫2.2. 对象进入老年代路径1. 对象年龄达到阈值后进入老年代默认状况下,对象在新生代经验了15次GC后,便会达到进入老年代的条件,将对象转移进入老年代。当然,年龄的阈值能够通过JVM参数进行设置: ...