问题
最近接触一个项目,项目灰度测试时发现3次下单2次超时。这就比较恐怖了,业务方之间反馈出来了,通过排查日志发现一个组装参数的方法耗时大概300~500ms,现在的RPC接口肯定不能接受。
排查方式
通过观察Young GC 发现一次300多ms,时间也正好吻合。
机器配置 2C4G
每次FullGC后,内存都能回到某一个值可以排除内存泄漏的情况
解决方式:
对垃圾回收器进行参数调优,调优过程发现程序处理问题的复杂度不同参数也需要微调。
最主要的是当程序足够复杂,JVM参数调优是不明显或者没有改观。
JVM参数给出:
-Xms2048m -Xmx2048m -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=50 -XX:ParallelGCThreads=2 -XX:CICompilerCount=2 -XX:ConcGCThreads=1 -XX:InitiatingHeapOccupancyPercent=30 -XX:G1MaxNewSizePercent=50 -XX:G1HeapRegionSize=4m -XX:+UseCompressedOops -XX:CompressedClassSpaceSize=128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -XX:+AlwaysPreTouch -XX:+UnlockDiagnosticVMOptions
首先添加GC日志
XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCDateStamps -Xloggc:gc.log
-
-XX:+PrintGC 输出简要GC日志
-
-XX:+PrintGCDetails 输出详细GC日志
-
-Xloggc:gc.log 输出GC日志到文件
-
-XX:+PrintGCTimeStamps 输出GC的时间戳(以JVM启动到当期的总时长的时间戳形式)
-
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-
-verbose:gc
-
-XX:+PrintReferenceGC 打印年轻代各个引用的数量以及时长跟踪软引用、弱引用、虚引用和Finallize队列。
-
-XX:+PrintGCApplicationConcurrentTime 打印应用程序的执行时间 -XX:+PrintGCApplicationStoppedTime 打印应用由于GC而产生的停顿时间
根据GC日志选择添加和调优
-XX:CompileThreshold=100 -XX:-UseCounterDecay -XX:+OptimizeStringConcat -XX:+UseStringCache
通常根据 -XX:InitiatingHeapOccupancyPercent 和-XX:G1MaxNewSizePercent、-XX:G1HeapRegionSize=4m 调优
通过 -XX:CompressedClassSpaceSize=128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m 设置方法区大小
-Xms2048m -Xmx2048m 初始化堆大小 调整 同最大堆大小 可提高性能,,