Java JVM参数配置与监控
合理的JVM参数配置和持续监控是保障系统稳定运行的关键。
JVM参数分类
| 类型 | 标识 | 示例 |
|---|---|---|
| 标准参数 | - | -version, -help |
| 非标准参数 | -X | -Xms, -Xmx, -Xss |
| 不稳定参数 | -XX | -XX:+UseG1GC |
核心参数详解
内存参数
Bash
# 堆内存
-Xms4g # 初始堆大小
-Xmx4g # 最大堆大小
-Xmn1g # 年轻代大小
-XX:NewRatio=2 # 老年代:年轻代比例
# 元空间(JDK8+)
-XX:MetaspaceSize=256m # 初始大小
-XX:MaxMetaspaceSize=512m # 最大大小
# 直接内存
-XX:MaxDirectMemorySize=1g
# 栈大小
-Xss256k # 每线程栈大小
GC参数
Bash
# 收集器选择
-XX:+UseG1GC # 使用G1
-XX:+UseParallelGC # 使用Parallel
-XX:+UseConcMarkSweepGC # 使用CMS
# GC日志
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-Xloggc:/logs/gc.log
# GC调优
-XX:MaxGCPauseMillis=200 # G1目标停顿
-XX:GCTimeRatio=99 # Parallel吞吐目标
-XX:CMSInitiatingOccupancyFraction=70 # CMS触发阈值
性能参数
Bash
# JIT编译
-XX:+TieredCompilation # 分层编译
-XX:CompileThreshold=10000 # 编译阈值
# 代码缓存
-XX:ReservedCodeCacheSize=256m
# 逃逸分析
-XX:+DoEscapeAnalysis
-XX:+EliminateAllocations
# 压缩指针
-XX:+UseCompressedOops # 堆<32GB时启用
-XX:+UseCompressedClassPointers
调试参数
Bash
# OOM时导出堆快照
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/logs/heap.hprof
# 错误日志
-XX:ErrorFile=/logs/hs_err_pid%p.log
# 信号处理
-XX:+PrintCommandLineFlags # 打印所有参数
监控命令
jstat - 实时监控
Bash
# 查看GC统计
jstat -gc <pid> 1000 5
# 输出解读
S0C S1C S0U S1U EC EU OC OU MC MU YGC YGCT FGC FGCT
512 512 0 128 4096 3600 8192 4096 1024 800 10 0.5 0 0
C=Capacity(容量), U=Used(已用)
YGC=年轻代GC次数, YGCT=年轻代GC时间
FGC=Full GC次数, FGCT=Full GC时间
# 查看GC百分比
jstat -gcutil <pid> 1000 5
# 查看类加载
jstat -class <pid>
jinfo - 查看参数
Bash
# 查看所有参数
jinfo -flags <pid>
# 查看指定参数
jinfo -flag MaxHeapSize <pid>
# 动态修改参数(部分参数支持)
jinfo -flag +PrintGC <pid>
jmap - 内存分析
Bash
# 查看堆内存信息
jmap -heap <pid>
# 生成堆快照
jmap -histo <pid> # 对象统计
jmap -histo:live <pid> # 只统计存活对象(触发Full GC)
# 导出堆快照文件
jmap -dump:format=b,file=heap.hprof <pid>
jstack - 线程分析
Bash
# 打印线程栈
jstack <pid>
# 查找死锁
jstack -l <pid>
# 输出示例
"Thread-1" #12 prio=5 os_prio=0 tid=0x00007f8c0 nid=0x12 waiting on condition
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304)
jcmd - 多功能命令
Bash
# 列出JVM进程
jcmd -l
# 查看VM信息
jcmd <pid> VM.info
# GC信息
jcmd <pid> GC.heap_info
# 线程信息
jcmd <pid> Thread.print
# 生成堆快照
jcmd <pid> GC.heap_dump /logs/heap.hprof
生产环境配置模板
Web应用(4核16GB)
Bash
JAVA_OPTS="
-Xms8g -Xmx8g
-Xmn3g
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/logs/heap.hprof
-Xloggc:/logs/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
"
后台任务(8核32GB)
Bash
JAVA_OPTS="
-Xms20g -Xmx20g
-Xmn8g
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-XX:GCTimeRatio=99
-XX:MaxGCPauseMillis=500
-XX:ParallelGCThreads=8
-Xloggc:/logs/gc.log
-XX:+PrintGCDetails
"
微服务(2核4GB)
Bash
JAVA_OPTS="
-Xms2g -Xmx2g
-Xmn768m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-XX:InitiatingHeapOccupancyPercent=35
-Xloggc:/logs/gc.log
"
监控平台推荐
| 工具 | 特点 |
|---|---|
| JConsole | JDK内置,简单易用 |
| VisualVM | JDK内置,功能丰富 |
| Arthas | 阿里开源,在线诊断 |
| Prometheus + Grafana | 生产监控平台 |
| SkyWalking | APM监控,链路追踪 |
Arthas常用命令
Bash
# 安装启动
java -jar arthas-boot.jar
# 查看JVM信息
dashboard
# 线程监控
thread
thread -n 5 # 最忙的5个线程
# 内存监控
memory
# GC监控
gc
# 监控方法执行
monitor -c 5 com.example.Service.*
# 查看方法调用路径
stack com.example.Service.query
# 反编译
jad com.example.Service
注意事项
-Xms和-Xmx设为相同,避免动态调整开销
GC日志必须开启,是问题排查的基础
jmap -histo:live会触发Full GC,谨慎使用
监控命令在生产环境可能影响性能,适度使用
建议部署监控平台持续观察,而非临时命令
要点总结
- 内存参数:-Xms/-Xmx(堆)、-Xmn(年轻代)、-XX:MetaspaceSize(元空间)
- GC参数:-XX:+UseG1GC、-XX:MaxGCPauseMillis、-Xloggc
- 监控命令:jstat(实时)、jmap(内存)、jstack(线程)
- 生产必须开启GC日志和HeapDump
- Arthas是线上诊断利器
📝 发现内容有误?点击此处直接编辑