Jvm调优实战
案例
每天100w登陆请求,8g内存如何设置jvm参数。
主要流程
初始计算。计算业务中对象创建速度,创建对象的大小。
配置比较。估算新生代的空间,比较不同的新生代大小,多久出发一次monorGc。
重新估算。为了避免频繁Gc,重新估算需要机器数量,jvm配置。
推演过程
估算qps。每天100w的请求,大约高峰期为100qps。
计算单节点创建对象速度。假设有3台机器,每台机器大约40qps。假设每次耗时1秒,jvm的新生代每秒要产生40个对象,1秒请求完毕后,变成垃圾。
计算对象大小。每个对象占用500字节,500/8/1024*40=2.5kb。考虑到RPC和DB操作,网络通信、写库、写缓存一顿操作下来,可以扩大到20-50倍。即每秒需要125kb。
计算gc次数。假设一台2c4g的配置,2g的堆内存,新生代默认只有2048*1/3=600mb大小。这样算下来,大约600*1024/125=4915s(81分钟)就会发生一次minor gc。
选择垃圾回收器
通常用吞吐量和系统响应时间来衡量系统性能指标。
吞吐量:单位时间内,能处理的请求。比如:1秒能处理多少请求。
响应时间:接口从请求到返回耗时。
在总资源有限的情况下,吞吐量需要结合响应时间做一个权衡。jvm在设计的时候,通常也是以此为目标。
常用的组合
响应优先。parNew+cms组合。-XX:+UseParNewGC -XX:+UseConcMarkSweepGC
吞吐优先。g1。-XX:+UseG1GC
业务系统
低延迟,敏感的用cms。
大内存(堆内存>=8g),高吞吐量的用G1。
jvm详细配置
堆一般设置为系统内存1/2,可发挥最大性能。-Xmx,-Xms设置。
指定新生代大小。默认是堆的1/3。sun推荐是3/8。注:新生代的配置比较灵活,可根据业务状态性来进行调整。业务无状态,则可以配置3/4的新生代。业务有状态(im服务,网关层),意味着需要更多的空间保存用户会话信息,新生代就可以使用默认的1/3大小。
指定栈大小。-Xss设置,通常为512-1024kb。
思路:短命对象,尽早的在minor gc阶段回收。长命对象尽早的进入老年代,避免新生代的来回复制。减少full gc的频率。
对象年龄判断调整
默认情况下,对象在经历15次gc还存在,则会转移到老年代。可以适当降低次数,提前进入老年代。
大对象直接进入老年代。
默认没有设置,考虑设置为1Mb即可。
oom时导出内存dump文件和gc日志。
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=${LOGDIR}/
-Xloggc:/dev/xxx/gc.log
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails通用jvm模版
基于4C8G系统的ParNew+CMS回收器模板(响应优先),新生代大小根据业务灵活调整!
-Xms4g
-Xmx4g
-Xmn2g
-Xss1m
-XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=10
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+AlwaysPreTouch
-XX:+HeapDumpOnOutOfMemoryError
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-Xloggc:gc.logGC的吞吐优先,推荐使用G1,基于8C16G系统的G1回收器模板:
-Xms8g
-Xmx8g
-Xss1m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=150
-XX:InitiatingHeapOccupancyPercent=40
-XX:+HeapDumpOnOutOfMemoryError
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-Xloggc:gc.logXX:MaxGCPauseMillis=N
最大GC停顿时间。柔性目标,JVM满足90%,不保证100%。
200
-XX:nitiatingHeapOccupancyPercent=n
当整个堆的空间使用百分比超过这个值时,就会融发MixGC
45
针对-XX:MaxGCPauseMillis来说,参数的设置带有明显的倾向性:调低↓:延迟更低,但MinorGC频繁,MixGC回收老年代区减少,增大Full GC的风险。调高↑:单次回收更多的对象,但系统整体响应时间也会被拉长。
针对InitiatingHeapOccupancyPercent来说,调参大小的效果也不一样:调低↓:更早触发MixGC,浪费cpu。调高↑:堆积过多代回收region,增大FullGC的风险。
Last updated
Was this helpful?