亿级流量系列——JVM调优原理深度剖析、服务线上优化实践( 二 )


1、标记垃圾 , 不清除垃圾 2、再次扫描 , 并向一端滑动(copy)存活对象(没有标记的对象) 3、回收另一端内存空间中垃圾
3.4 可用垃圾回收器Java语言有一个特性 , 自己有自己的垃圾回收器;而且有很多个垃圾回收器;因此就需要根据不同的场景 , 选择不同的垃圾回收器;
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
Jvm提供了10种垃圾回收器;如此多的垃圾回收器 , 在项目中到底使用哪个组合的垃圾回收器呢??
1)serial(年轻代垃圾回收) + serialOld(回收老年代的垃圾) : 串行化的回收器 , 因此在当下多核心cpu的时候 , 不太适合 , 只适合单核cpu的垃圾回收;
2)parNew + CMS : 并行;并发 垃圾回收器;此组合在响应时间优先垃圾回收器组合
3)Parallel Scavenge + Parallel Old (简称:ps+po): 并发垃圾回收器 , 是jdk默认的垃圾回收器组合
4)g1 垃圾回收器 (逻辑上分化) , 把年轻代和老年代合二为一的方式进行垃圾回收;
3.5 串行垃圾回收器
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
注意:
1、当进行垃圾回收时候 , 所有的业务线程都必须暂时挂起 , 以便于垃圾回收进行;
2、safe point就是让用户线程进行挂起 , 这样jvm线程才可以进行安全地对垃圾进行标记;
3.6 Ps + po
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
3.7 parNew + CMS
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
3.8 G1垃圾回收器
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
4 内存分代模型
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
问题: 一个大对象来了以后 , 做什么? eden放得下?--- 否 --- (YGC)--- eden放得下? --- 否 ---- old能下 ----是 --- 可以放入old -----否---- fullgc oom
5 jvm调优实战5.1 典型调优参数设置服务器配置: 4cpu,8GB内存 ---- jvm调优实际上是设置一个合理大小的jvm堆内存(既不能太大 , 也不能太小)
-Xmx3550m设置jvm堆内存最大值(经验值设置: 根据压力测试 , 根据线上程序运行效果情况)-Xms3550m设置jvm堆内存初始化大小 , 一般情况下必须设置此值和最大的最大的堆内存空间保持一致 , 防止内存抖动 , 消耗性能-Xmn2g 设置年轻代占用的空间大小-Xss256k 设置线程堆栈的大小;jdk5.0以后默认线程堆栈大小为1MB; 在相同的内存情况下 , 减小堆栈大小 , 可以使得操作系统创建更多的业务线程;复制代码jvm堆内存设置:
nohup java -Xmx3550m -Xms3550m -Xmn2g -Xss256k -jar jshop-web-1.0-SNAPSHOT.jar --spring.addition-location=application.yaml > jshop.log 2>&1 $&
TPS性能曲线:
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
5.2 分析gc日志如果需要分析gc日志 , 就必须使得服务gc输入gc详情到log日志文件中 , 然后使用相应gc日志分析工具来对日志进行分析即可;
把gc详情输出到一个gc.log日志文件中 , 便于gc分析
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:gc.log
Throughput: 业务线程执行时间 / (gc时间+业务线程时间)
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
分析gc日志 , 发现 , 一开始就发生了3次fullgc , 很明显jvm优化参数的设置是有问题的;
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
查看fullgc发生问题原因: jstat -gcutil pid
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
Metaspace持久代: 初始化分配大小20m , 当metaspace被占满后 , 必须对持久代进行扩容 , 如果metaspace每进行一次扩容 , fullgc就需要执行一次;(fullgc回收整个堆空间 , 非常占用时间)
调整gc配置: 修改永久代空间初始化大小:
nohup java -Xmx3550m -Xms3550m -Xmn2g -Xss256k -XX:MetaspaceSize=256m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:gc.log -jar jshop-web-1.0-SNAPSHOT.jar --spring.addition-location=application.yaml > jshop.log 2>&1 $&
经过调优后 , fullgc现象已经消失了:
亿级流量系列——JVM调优原理深度剖析、服务线上优化实践文章插图
5.3 Young&Old比例年轻代和老年代比例:1:2 参数:-XX:NewRetio = 4 , 表示年轻代(eden,s0,s1)和老年代所占比值为1:4