Jvm调优实战

案例

每天100w登陆请求,8g内存如何设置jvm参数。

主要流程

  1. 初始计算。计算业务中对象创建速度,创建对象的大小。

  2. 配置比较。估算新生代的空间,比较不同的新生代大小,多久出发一次monorGc。

  3. 重新估算。为了避免频繁Gc,重新估算需要机器数量,jvm配置。

推演过程

  1. 估算qps。每天100w的请求,大约高峰期为100qps。

  2. 计算单节点创建对象速度。假设有3台机器,每台机器大约40qps。假设每次耗时1秒,jvm的新生代每秒要产生40个对象,1秒请求完毕后,变成垃圾。

  3. 计算对象大小。每个对象占用500字节,500/8/1024*40=2.5kb。考虑到RPC和DB操作,网络通信、写库、写缓存一顿操作下来,可以扩大到20-50倍。即每秒需要125kb。

  4. 计算gc次数。假设一台2c4g的配置,2g的堆内存,新生代默认只有2048*1/3=600mb大小。这样算下来,大约600*1024/125=4915s(81分钟)就会发生一次minor gc。

选择垃圾回收器

通常用吞吐量和系统响应时间来衡量系统性能指标。

吞吐量:单位时间内,能处理的请求。比如:1秒能处理多少请求。

响应时间:接口从请求到返回耗时。

在总资源有限的情况下,吞吐量需要结合响应时间做一个权衡。jvm在设计的时候,通常也是以此为目标。

常用的组合

  1. 响应优先。parNew+cms组合。-XX:+UseParNewGC -XX:+UseConcMarkSweepGC

  2. 吞吐优先。g1。-XX:+UseG1GC

业务系统

  1. 低延迟,敏感的用cms。

  2. 大内存(堆内存>=8g),高吞吐量的用G1。

jvm详细配置

  1. 堆一般设置为系统内存1/2,可发挥最大性能。-Xmx,-Xms设置。

  2. 指定新生代大小。默认是堆的1/3。sun推荐是3/8。注:新生代的配置比较灵活,可根据业务状态性来进行调整。业务无状态,则可以配置3/4的新生代。业务有状态(im服务,网关层),意味着需要更多的空间保存用户会话信息,新生代就可以使用默认的1/3大小。

  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.log

GC的吞吐优先,推荐使用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.log
G1参数
描述
默认值

XX: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?