JVM 速查表
快速查阅JVM常用命令、参数和概念。
常用命令
进程管理
| 命令 | 用途 | 示例 |
|---|---|---|
jps | 列出Java进程 | jps -lmv |
jstat | JVM统计信息 | jstat -gc <pid> 1000 |
jmap | 内存映射 | jmap -dump:format=b,file=heap.hprof <pid> |
jstack | 线程堆栈 | jstack -l <pid> |
jinfo | 配置信息 | jinfo -flags <pid> |
jcmd | 多功能诊断 | jcmd <pid> help |
jstat常用选项
jstat -class <pid> # 类加载统计
jstat -compiler <pid> # 编译统计
jstat -gc <pid> # GC统计
jstat -gccapacity <pid> # GC容量
jstat -gcutil <pid> # GC利用率
jstat -gccause <pid> # GC原因
jmap常用选项
jmap -heap <pid> # 堆配置
jmap -histo <pid> # 对象统计
jmap -histo:live <pid> # 存活对象统计
jmap -dump:format=b,file=x.hprof <pid> # 堆转储
jmap -dump:live,format=b,file=x.hprof <pid> # 存活对象堆转储
jcmd常用命令
jcmd <pid> VM.version # JVM版本
jcmd <pid> VM.flags # JVM参数
jcmd <pid> VM.command_line # 命令行
jcmd <pid> GC.run # 触发GC
jcmd <pid> GC.heap_dump # 堆转储
jcmd <pid> Thread.print # 线程信息
jcmd <pid> VM.native_memory summary # 原生内存
内存参数
堆内存
| 参数 | 说明 | 示例 |
|---|---|---|
-Xms | 初始堆大小 | -Xms2g |
-Xmx | 最大堆大小 | -Xmx2g |
-Xmn | 新生代大小 | -Xmn512m |
-XX:NewRatio | 新老年代比例 | -XX:NewRatio=2 |
-XX:SurvivorRatio | Eden/Survivor比例 | -XX:SurvivorRatio=8 |
元空间
| 参数 | 说明 | 示例 |
|---|---|---|
-XX:MetaspaceSize | 初始元空间大小 | -XX:MetaspaceSize=128m |
-XX:MaxMetaspaceSize | 最大元空间大小 | -XX:MaxMetaspaceSize=512m |
栈内存
| 参数 | 说明 | 示例 |
|---|---|---|
-Xss | 线程栈大小 | -Xss1m |
直接内存
| 参数 | 说明 | 示例 |
|---|---|---|
-XX:MaxDirectMemorySize | 最大直接内存 | -XX:MaxDirectMemorySize=256m |
垃圾收集器参数
Serial
-XX:+UseSerialGC
Parallel
-XX:+UseParallelGC
-XX:MaxGCPauseMillis=200
-XX:GCTimeRatio=99
-XX:+UseAdaptiveSizePolicy
G1
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=4m
-XX:InitiatingHeapOccupancyPercent=45
ZGC
-XX:+UseZGC
-XX:MaxGCPauseMillis=10
GC日志参数
JDK 8及之前
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCCause
-XX:+PrintHeapAtGC
-Xloggc:/path/to/gc.log
JDK 9及之后
-Xlog:gc*:file=/path/to/gc.log:time,level,tags
-Xlog:gc+heap=debug
-Xlog:gc+ergo*=trace
内存区域
运行时数据区
堆内存结构
堆内存
├── 新生代 (Young Generation)
│ ├── Eden区 (80%)
│ ├── Survivor 0 (10%)
│ └── Survivor 1 (10%)
└── 老年代 (Old Generation)
类加载器层次
垃圾收集器对比
| 收集器 | 算法 | 适用场景 | 特点 |
|---|---|---|---|
| Serial | 复制/标记-整理 | 客户端 | 简单、单线程 |
| Parallel | 复制/标记-整理 | 吞吐量优先 | 多线程 |
| CMS | 标记-清除 | 低延迟 | 并发、有碎片 |
| G1 | 标记-整理+复制 | 服务端通用 | 可预测停顿 |
| ZGC | 染色指针 | 大内存 | 超低延迟 |
常用诊断场景
内存泄漏
# 1. 生成堆转储
jmap -dump:live,format=b,file=heap.hprof <pid>
# 2. 使用MAT分析
# - 查看Dominator Tree
# - 查看Leak Suspects
# - 分析引用链
线程死锁
# 1. 检测死锁
jstack -l <pid> | grep -A 20 "Found one Java-level deadlock"
# 2. 使用VisualVM
# - 线程标签页
# - 检测死锁按钮
CPU过高
# 1. 找到CPU高的线程
top -H -p <pid>
# 2. 转换线程ID为16进制
printf "%x\n" <thread_id>
# 3. 查看线程堆栈
jstack <pid> | grep -A 20 <hex_thread_id>
Full GC频繁
# 1. 查看GC统计
jstat -gcutil <pid> 1000
# 2. 分析GC日志
# - 查看GC原因
# - 查看GC时间
# 3. 调整参数
# - 增大堆内存
# - 调整新生代大小
# - 更换收集器
性能调优模板
小型应用
java -Xms512m -Xmx512m \
-XX:+UseSerialGC \
-jar app.jar
吞吐量优先
java -Xmx4g -Xms4g \
-XX:+UseParallelGC \
-XX:NewRatio=2 \
-XX:SurvivorRatio=8 \
-XX:GCTimeRatio=99 \
-jar app.jar
延迟优先
java -Xmx4g -Xms4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=100 \
-XX:InitiatingHeapOccupancyPercent=35 \
-jar app.jar
大内存
java -Xmx16g -Xms16g \
-XX:+UseZGC \
-XX:MaxGCPauseMillis=10 \
-jar app.jar
容器环境
java -XX:+UseContainerSupport \
-XX:MaxRAMPercentage=75.0 \
-XX:InitialRAMPercentage=75.0 \
-jar app.jar
常用JVM版本
| JDK版本 | 发布日期 | 主要特性 | LTS |
|---|---|---|---|
| JDK 8 | 2014-03 | Lambda、Stream API | ✓ |
| JDK 11 | 2018-09 | HTTP Client、ZGC | ✓ |
| JDK 17 | 2021-09 | Sealed Classes、Pattern Matching | ✓ |
| JDK 21 | 2023-09 | Virtual Threads、Pattern Matching for Switch | ✓ |