参数建议
这些建议基于以下前提:
- 服务器 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 机器
|
|
其它
- 建议升级 JDK 至少到 1.8.0_191-b12 及以上,原因参考 JVM如何获取当前容器的资源限制? 和 云原生架构:容器资源限制及资源可见性