跳到主要内容

JVM 速查表

快速查阅JVM常用命令、参数和概念。

常用命令

进程管理

命令用途示例
jps列出Java进程jps -lmv
jstatJVM统计信息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:SurvivorRatioEden/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 82014-03Lambda、Stream API
JDK 112018-09HTTP Client、ZGC
JDK 172021-09Sealed Classes、Pattern Matching
JDK 212023-09Virtual Threads、Pattern Matching for Switch

参考资源