JVM 参数建议及理由

最后修改于:

参数建议

这些建议基于以下前提:

  • 服务器 CPU 支持超线程,即一个核可以当成两个核用,否则,GC 线程相关参数值应该减半;
  • 如果 JDK 版本小于 1.8.0_191-b12(如JDK 1.8.0_151),则需要设置 -XX:ParallelGCThreads=n, -XX:ConcGCThreads=n, -XX:G1ConcRefinementThreads=n 三个参数;
  • 如果 JDK 版本升级到 1.8.0_191-b12 及以上,则最好不要设置上述三个参数,改为设置 -XX:+UnlockExperimentalVMOptions -XX:ActiveProcessorCount=n,n 取容器核数

统一设置的参数

-XX:+UseG1GC 使用垃圾优先(G1)收集器
-XX:+PrintFlagsFinal 打印所有参数的最终值(参考:Java -XX:+PrintFlagsFinal命令行参数详解)
-XX:+PrintCommandLineFlags 是打印那些被新值覆盖的项
-XX:+PrintStringTableStatistics 在 JVM 进程退出时会输出 SymbolTable 统计和 StringTable 统计(参考:聊聊jvm的StringTable及SymbolTable)
-XX:+PrintGC
打印GC日志
-XX:+PrintGCDetails 打印详细的GC日志,还会在退出前打印堆的详细信息
-XX:+PrintGCDateStamps 打印CG发生的日期时间
-XX:+PrintGCTimeStamps 打印CG发生的相对时间戳
-XX:+PrintHeapAtGC 每次GC前后打印堆信息
-XX:+PrintTenuringDistribution YGC 时,打印出幸存区中对象的年龄分布
-XX:+PrintAdaptiveSizePolicy 打印分代大小调整的信息
-XX:+PrintGCApplicationStoppedTime
打印应用由于GC而产生的停顿时间
-XX:+PrintGCApplicationConcurrentTime 打印应用程序的执行时间
-XX:+PrintReferenceGC 打印软引用、弱引用、虚引用和Finallize队列处理情况
-XX:ParallelRefProcEnabled 启用并行引用处理
-XX:-OmitStackTraceInFastThrow 禁用 FastThrow 优化。如果开启,会导致抛出异常时没有堆栈信息,不利于排查问题。
-Xloggc:/app/logs/gc_$HOSTNAME.log GC 日志路径
-XX:GCLogFileSize=30M GC 日志文件大小
-XX:+UseGCLogFileRotation 启用 GC 日志文件滚动策略,需要先设置 -Xloggc
-XX:NumberOfGCLogFiles=10 设置滚动日志时的文件数
-XX:+HeapDumpOnOutOfMemoryError 当发生 OOM 时,自动生成 dump 文件
-XX:HeapDumpPath="/app/logs/java_%p_$HOSTNAME.hprof" 指定 dump 文件的路径
-XX:ErrorFile=/app/logs/hs_err_%p_$HOSTNAME.log 错误发生时,错误数据的存储路径
-Djava.security.egd=file:/dev/./urandom 加快随机数产生过程

允许调整的参数

-Xms2g -Xms4g total_memory / 2 最小堆内存,JVM 初始化时就会分配的堆内存大小。
-Xmx2g -Xms4g total_memory / 2 最大堆内存
-XX:MaxDirectMemorySize=512m -XX:MaxDirectMemorySize=512m - 设置最大直接内存(参考 JVM源码分析之堆外内存完全解读
-XX:MaxMetaspaceSize=512m -XX:MaxMetaspaceSize=512m - 设置最大元空间(参考JVM源码分析之Metaspace解密
-XX:MaxGCPauseMillis=200 -XX:MaxGCPauseMillis=200 - 设置最大GC暂停时间的目标。这是一个软目标,JVM将尽最大努力实现它。默认 200ms。
-XX:ParallelGCThreads=4 -XX:ParallelGCThreads=8 - 设置垃圾回收器并行阶段使用的线程数。计算公式见JVM调优系列: 默认GC线程数的计算公式
-XX:ConcGCThreads=1 -XX:ConcGCThreads=2 - 设置垃圾回收器并发阶段使用的线程数
-XX:G1ConcRefinementThreads=5 -XX:G1ConcRefinementThreads=9 ParallelGCThreads+1 设置并发优化线程,只专注扫描日志缓冲区记录的卡片来维护更新 RSet
-XX:G1ReservePercent=10 -XX:G1ReservePercent=10 - 设置要保持空闲的预留内存的百分比,以减少空间溢出的风险。 默认值是10%。 当增加或减少这个百分比时,请确保对Java堆总量进行相同的调整。
-XX:InitiatingHeapOccupancyPercent=45 -XX:InitiatingHeapOccupancyPercent=45 - 启动并发GC周期的(整个)堆占用的百分比。 它由基于整个堆占用情况触发并发GC周期的GC使用,而不仅仅是其中的一个代(例如G1)。 值为0表示“执行恒定的GC周期”。 缺省值为45。
-XX:SoftRefLRUPolicyMSPerMB=1000 -XX:SoftRefLRUPolicyMSPerMB=1000 - 每1M空闲空间可保持的SoftReference对象生存的时长(单位ms)(参考:一次 JVM FullGC 的排查过程及解决方案!

不建议设置的参数

  • 不设置 -XX:+DisableExplicitGC,这样允许业务使用 System.gc() 在某些特定情况下主动 FullGC;
  • 不要指定 -Xmn 参数,让 G1 自己去调整;如果设置了年轻代大小,会导致 G1 无法使用暂停时间目标;

完整参数示例

以下针对 4C8G 机器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
-Xms4g
-Xmx4g
-XX:MaxDirectMemorySize=512m
-XX:MaxMetaspaceSize=512m
-XX:+PrintFlagsFinal
-XX:+PrintCommandLineFlags
-XX:+PrintStringTableStatistics
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:ParallelGCThreads=8
-XX:ConcGCThreads=2
-XX:G1ConcRefinementThreads=9
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-XX:+PrintTenuringDistribution
-XX:+PrintAdaptiveSizePolicy
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCApplicationConcurrentTime
-XX:G1ReservePercent=10
-XX:InitiatingHeapOccupancyPercent=45
-XX:SoftRefLRUPolicyMSPerMB=1000
-XX:+PrintReferenceGC 
-XX:ParallelRefProcEnabled
-Xloggc:/app/logs/gc_$HOSTNAME.log 
-XX:GCLogFileSize=30M
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=5
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath="/app/logs/java_%p_$HOSTNAME.hprof"
-XX:ErrorFile=/app/logs/hs_err_%p_$HOSTNAME.log
-XX:-OmitStackTraceInFastThrow
-Djava.security.egd=file:/dev/./urandom

其它

参考资料

Licensed under CC BY-NC-SA 4.0
最后更新于 2024/12/20 12:18 CST
本文总阅读量 次 本文总访客量 人 本站总访问量 次 本站总访客数
发表了20篇文章 · 总计32.36k字
本博客已稳定运行
使用 Hugo 构建
主题 StackJimmy 设计