JVM 参数配置规范

废话不说,直接上干货!!!

JVM 规范:

参数 备注/参数释义 交易规范
JVM版本 1.8.0_60以下,无法使用Pfinder 1.8.0_131之前,jvm无法感知docker的真实核数和内存大小,而是使用的宿主机的核数和内存 必须1.8.0_60以上 推荐1.8.0_191以上
JVM GC方法 ParallelGC:1.8默认,高吞吐量,响应时间不敏感 CMS:响应优先,堆内存8G以下优先选择 G1:响应优先,堆内存8G及以上选择 C端应用:8G及以上选择G1,8G以下选择CMS B端应用:推荐使用ParallelGC
Xmx 堆的最大值 必须配置 小于8G的,不超过50% 8G的,最多可以设置6G 12G的,最多设置为8G 16G的,最多设置为12G 32G的,最多设置为24G
Xms 初始堆的大小,也是堆大小的最小值 必须配置 与Xmx一致
MaxDirectMemorySize 堆外内存大小 一般无需配置 使用了OHC等堆外缓存的需要配置,配置时需与架构师评审并压测
ParallelGCThreads 并行GC时的线程数(ParallelGC、CMS、G1均适用) 此值过小,则stw时间变长,此值过大,影响吞吐量,CPU过高 必须配置 =容器核数
ConcGCThreads 并发标记时的线程数 并发标记时并没有stw,CPU密集型任务(CMS、G1才有并发标记步骤) 限CMS、G1必须配置 ParallelGCThreads的20%~50% 一般为ParallelGCThreads/4或ParallelGCThreads/2
CICompilerCount JIT进行热点编译的线程数 CPU密集型任务 必须配置(值要大于2) 推荐值如下: 1C容器 : 2 2C容器:2 4C容器 : 2~4 8C容器:2~4 16C容器 : 4~12
MetaspaceSize MaxMetaspaceSize 元空间初始大小、元空间最大大小 如果未指定初始大小,默认是20m,应用启动时如果不够就会gc来扩容 元空间并不在虚拟机中,而是使用本机内存,因此受本机内存限制 jdk1.8适用,必须配置 需要大于256M
Xmn NewRatio Xmn:新生代内存大小 NewRatio:老年代与新生代与内存容量的比例 x:1 这2个参数只需设置其中1个即可,若都设置了,以Xmn为准 CMS必须设置,只需配置其中1个参数;G1不要设置 Xmn=堆内存Xmx的 1/3 NewRatio=2
UseCMSInitiatingOccupancyOnly CMSInitiatingOccupancyFraction=x CMSInitiatingOccupancyFraction为堆内存占用率达到百分比时开始GC的阈值 默认不设置时,由JVM自动计算垃圾回收的周期 CMS必须设置 推荐值70~80
UseCMSCompactAtFullCollection CMSFullGCsBeforeCompaction=x CMSFullGCsBeforeCompaction为配置fullGC时,进行了多少次fullGC之后对老年代进行压缩整理处理碎片 CMS专用,不强制 推荐值1
HeapDumpOnOutOfMemoryError HeapDumpPath=/export/Logs/ 首次遭遇OOM时导出此时堆中相关信息 路径带"/"则为目录,否则为文件 必须配置 文件目录需要为已存在的目录,若配置为具体文件,其所属目录也需要为已存在的目录

JVM配置示例

以下为交易应用容器规格分布和JVM参考配置:

序号 容器规格 容器数量 JVM配置样例
1 8C16G 43378 使用G1: export JAVA_OPTS="-Djava.library.path=/usr/local/lib -server -Xms8192m -Xmx8192m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:ParallelGCThreads=8 -XX:ConcGCThreads=4 -XX:CICompilerCount=4 -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000 -Djmagick.systemclassloader=no -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs/"
2 4C8G 25506 使用G1: export JAVA_OPTS="-Djava.library.path=/usr/local/lib -server -Xms4096m -Xmx4096m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:ParallelGCThreads=4 -XX:ConcGCThreads=2 -XX:CICompilerCount=2 -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000 -Djmagick.systemclassloader=no -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs/" 使用CMS: export JAVA_OPTS="-Djava.library.path=/usr/local/lib -server -Xms4096m -Xmx4096m -XX:MetaspaceSize=256m -XX:MaxDirectMemorySize=512m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:NewRatio=2 -XX:ParallelGCThreads=4 -XX:ConcGCThreads=2 -XX:CICompilerCount=2 -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000 -Djmagick.systemclassloader=no -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs/" 使用ParallelGC(1.8默认): export JAVA_OPTS="-Djava.library.path=/usr/local/lib -server -Xms4096m -Xmx4096m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UnlockExperimentalVMOptions -XX:ParallelGCThreads=4 -XX:CICompilerCount=2 -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000 -Djmagick.systemclassloader=no -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs/"
3 16C32G 24735 使用G1(该应用使用了OHC堆外缓存,故配置了堆外内存大小): export JAVA_OPTS="-Djava.library.path=/usr/local/lib -server -Xms20480m -Xmx20480m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:ParallelGCThreads=16 -XX:ConcGCThreads=8 -XX:CICompilerCount=8 -XX:G1HeapRegionSize=8m -XX:MaxDirectMemorySize=8192m -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000 -Djmagick.systemclassloader=no -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs/"
4 8C12G 15690 建议置换为8C16容器,参考8C16G的配置,注意按规范控制Xmx的大小
5 16C16G 10908 使用G1: export JAVA_OPTS="-Djava.library.path=/usr/local/lib -server -Xms8192m -Xmx8192m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:ParallelGCThreads=16 -XX:ConcGCThreads=8 -XX:CICompilerCount=8 -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000 -Djmagick.systemclassloader=no -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/Logs/"
相关推荐
DBWYX16 小时前
JVM 精华
jvm
jiedaodezhuti1 天前
为什么elasticsearch配置文件JVM配置31G最佳
大数据·jvm·elasticsearch
进击的雷神1 天前
数据库知识全面考查:从基础概念到实战应用
jvm·数据库·oracle
昔我往昔1 天前
除了GC哪些地方有用到安全点
java·jvm·安全
胡子发芽1 天前
面试题:请解释Java中的垃圾回收机制(Garbage Collection, GC),并讨论不同的垃圾回收算法及其优缺点
java·jvm
難釋懷1 天前
Android开发-在应用之间共享数据
android·jvm·oracle
陵易居士1 天前
JVM-类加载子系统
jvm·笔记·学习
开源架构师2 天前
JVM 与云原生的完美融合:引领技术潮流
jvm·微服务·云原生·性能优化·serverless·内存管理·容器化
意倾城2 天前
JVM内存模型
java·jvm
LUCIAZZZ2 天前
JVM之虚拟机运行
java·jvm·spring·操作系统·springboot