一、如何查看当前服务实际生效jvm参数
1.运行中进程查看(最常用)
# 1. 查java进程pid jps -l # 2. 打印完整启动命令(含所有jvm参数) jinfo <pid> # 只看jvm参数 jinfo -flags <pid> # 3. 导出完整堆+启动参数 jmap -heap <pid>
2.启动日志直接看
服务启动第一行日志一般会打印:
commandline flags: -xx:+useg1gc -xms2g -xmx4g ...
3.启动时打印全部参数(主动输出)
添加启动参数:
-xx:+printcommandlineflags
启动后控制台会输出所有显式 / 隐式生效 jvm 参数。
二、jvm核心参数分类+标准配置说明
1. 堆内存参数(最核心,必配)
-xms:初始堆内存
- 作用:jvm 启动时分配的堆大小
- 规范:建议和 xmx 相等,避免运行时频繁扩容堆,stw 卡顿
- 示例:-xms2g 初始 2g 堆
-xmx:最大堆内存
- 作用:堆能扩容到的上限,oom 超过该值
- 配置经验:
- 4c8g 服务器:-xms3g -xmx3g
- 8c16g 服务器:-xms8g -xmx8g
- 容器环境:堆不超过容器内存 70%,预留给元空间、栈、系统
-xmn:新生代总大小(等价 -xx:newsize + -xx:maxnewsize)
- 新生代 = eden + 2*survivor
- 经验:新生代占堆 20%~30%
- 示例:-xmn1g
-xx:newratio:老年代 / 新生代比例
- -xx:newratio=2:老年代:新生代 = 2:1
-xx:survivorratio:eden/survivor 比例
- -xx:survivorratio=8:eden:s0:s1=8:1:1
2. 元空间(metaspace,jdk8 +永久代移除)
-xx:metaspacesize:元空间初始阈值,达到触发 fullgc
-xx:maxmetaspacesize:元空间最大值,不设则无限占用本地内存
标准配置:-xx:metaspacesize=256m -xx:maxmetaspacesize=512m
3. 线程栈内存
-xss:每个 java 线程栈大小
默认:jdk1.5+ 1m
小容器 / 多线程场景调小:-xss256k
递归深度大的服务调大:-xss2m
4. 垃圾回收器(gc核心参数)
1. g1gc(jdk8 默认,生产最常用)
-xx:+useg1gc # 启用g1 -xx:maxgcpausemillis=200 # 目标最大停顿时间200ms -xx:g1heapregionsize=4m # g1分区大小 1/2/4/8/16/32m -xx:g1newsizepercent=20 # 新生代最小占堆20% -xx:g1maxnewsizepercent=30 # 新生代最大占堆30%
2. zgc(jdk11 + 低延迟大堆)
-xx:+usezgc -xx:zcollectioninterval=300 # 定时gc间隔
3. parallelgc(吞吐量优先,批处理任务)
-xx:+useparallelgc -xx:parallelgcthreads=8 # gc并行线程数
5.gc日志排查参数(线上必备)
# 开启gc日志文件滚动,防止打满磁盘 -xloggc:/logs/gc-%t.log -xx:+usegclogfilerotation -xx:numberofgclogfiles=10 -xx:gclogfilesize=100m # 打印详细gc信息 -xx:+printgcdetails -xx:+printgcdatestamps -xx:+printheapatgc # jdk9+统一日志框架简化写法: -xlog:gc*:file=/logs/gc.log:time,uptime,level,tags:filecount=10,filesize=100m
6.oom内存dump参数(故障定位)
# oom时自动导出堆快照 -xx:+heapdumponoutofmemoryerror # dump文件路径 -xx:heapdumppath=/logs/heapdump.hprof
7. 直接内存(nio、netty、rocketmq等中间件必调)
-xx:maxdirectmemorysize:最大堆外直接内存 netty 服务示例:-xx:maxdirectmemorysize=1g 不配置默认等于 xmx,高并发网络服务容易堆外 oom。
8. 系统优化辅助参数
# 禁用显式gc(代码system.gc()无效,避免业务误触发fullgc) -xx:+disableexplicitgc # 开启类加载统计 -xx:+traceclassloading # 压缩指针(64位jdk默认开启,堆>32g失效) -xx:+usecompressedoops # 并行类加载 -xx:+parallelrefprocenabled
三、标准线上完整jvm配置示例(8c16g springboot微服务)
java \ -xx:+printcommandlineflags \ -xms8g -xmx8g \ -xmn2g \ -xss256k \ -xx:metaspacesize=256m -xx:maxmetaspacesize=512m \ -xx:maxdirectmemorysize=1g \ -xx:+useg1gc \ -xx:maxgcpausemillis=200 \ -xloggc:/data/logs/gc-%t.log \ -xx:+usegclogfilerotation \ -xx:numberofgclogfiles=10 \ -xx:gclogfilesize=100m \ -xx:+heapdumponoutofmemoryerror \ -xx:heapdumppath=/data/logs/heapdump.hprof \ -xx:+disableexplicitgc \ -jar app.jar
四、启动日志打印对应参数解读举例
启动日志输出片段:
commandline flags: -xx:+disableexplicitgc -xx:+heapdumponoutofmemoryerror -xx:maxdirectmemorysize=1073741824 -xx:maxgcpausemillis=200 -xx:maxmetaspacesize=536870912 -xx:metaspacesize=268435456 -xx:+printcommandlineflags -xx:+useg1gc -xms8589934592 -xmx8589934592 -xmn2147483648 -xss262144
转换对照:
- -xms8589934592 = 8g
- -xss262144 = 256k
- -xx:maxdirectmemorysize=1073741824 = 1g
五、常见疑问
- 为什么 xms=xmx?
堆扩容会 stw,固定堆大小减少 gc 停顿,线上标准规范。
- 元空间为什么要限制 maxmetaspacesize?
元空间使用操作系统本地内存,不限制会导致进程内存泄漏、宿主机内存耗尽。
- 堆外内存溢出怎么排查?
配置maxdirectmemorysize,配合 gc 日志、-xx:+printdirectmemorystats监控。
到此这篇关于java服务启动jvm核心参数的文章就介绍到这了,更多相关java服务启动jvm核心参数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论