文章目录
- JVM常用参数
- 一、堆内存相关
- 二、线程与栈相关
- 三、永久代 / 元空间相关(JDK8 之前)
- 四、垃圾回收(GC)相关
- 五、类加载 / 调试相关
- JVM 排查工具
- 1. OOM(内存溢出)问题排查
- 2. CPU 高占用排查
- 3. 线程阻塞/死锁排查
- 4. GC 频繁或长停顿排查
- 5. JVM 参数与配置检查
- 常用命令
- 1. **jps**(JVM Process Status Tool)
- 2. **jstat**(JVM Statistics Monitoring)
- 3. **jmap**(JVM Memory Map)
- 4. **jhat**(JVM Heap Analysis Tool)
- 5. **jstack**(JVM Stack Trace)
- 6. **jinfo**(JVM Configuration info)
JVM常用参数
参数 | 说明 | 默认/官方推荐 | 示例 | 使用场景 / 备注 |
---|
-Xms | 初始堆大小 | 默认物理内存的 1/64 | -Xms512M | 避免频繁扩展堆,提高启动性能 |
-Xmx | 最大堆大小 | 默认物理内存的 1/4 | -Xmx2G | 控制堆最大占用,防止 OOM |
-Xmn | 新生代大小 | 官方推荐为整个堆的 3/8 | -Xmn512M | 影响 Minor GC,调优年轻代比例 |
-Xss | 线程堆栈大小 | JDK1.5 及之后默认 1M,之前默认 256k | -Xss512k | 调整线程栈深度,防止 StackOverflowError |
-XX:NewRatio=n | 新生代与老年代比例 | / | -XX:NewRatio=3 | 年轻代占整个堆的 1/(n+1),影响 GC 策略 |
-XX:SurvivorRatio=n | Eden 与 Survivor 区比例 | / | -XX:SurvivorRatio=8 | 年轻代中 Eden:Survivor = 8:1:1 |
-XX:PermSize=n | 永久代初始大小 | 默认物理内存的 1/64 | -XX:PermSize=128M | JDK8 之前,存放类元数据 |
-XX:MaxPermSize=n | 永久代最大大小 | 默认物理内存的 1/4 | -XX:MaxPermSize=256M | 避免 PermGen OOM |
-verbose:class | 类加载信息打印 | / | - | 用于排查类加载问题 |
-verbose:gc | GC 日志打印 | / | - | 简单了解 GC 执行情况 |
-XX:+PrintGC | 打印 GC 日志 | / | - | 基础 GC 日志输出 |
-XX:+PrintGCDetails | 打印详细 GC 日志 | / | - | 包含每代回收情况 |
-XX:+PrintGCDateStamps | GC 日志时间戳 | / | - | 便于分析 GC 时间线 |
-Xloggc:filename | 指定 GC 日志路径 | / | -Xloggc:/data/jvm/gc.log | 输出到文件,便于后续分析 |
-XX:+UseSerialGC | 年轻代串行收集器 | / | - | 单线程收集,适合小堆或低并发 |
-XX:+UseParallelGC | 年轻代并行收集器 | / | - | 并行 Minor GC,适合多 CPU |
-XX:ParallelGCThreads=n | 并行 GC 线程数 | / | -XX:ParallelGCThreads=4 | 设置 Parallel Scavenge 使用的 CPU 核心数 |
-XX:MaxGCPauseMillis=n | 最大 GC 停顿时间(ms) | / | -XX:MaxGCPauseMillis=100 | 并行收集器调优目标 |
-XX:GCTimeRatio=n | GC 时间占比 | / | -XX:GCTimeRatio=19 | 程序运行时间占比 1/(1+n) |
-XX:+UseParallelOldGC | 老年代并行收集器 | / | - | 配合 Parallel Scavenge 使用,适合吞吐量优化 |
-XX:+UseConcMarkSweepGC | CMS 并发老年代收集器 | / | - | 降低 Full GC 停顿时间 |
-XX:+CMSIncrementalMode | CMS 增量模式 | / | - | 单 CPU 时可降低停顿,JDK 8 后可忽略 |
一、堆内存相关
参数 | 说明 | 默认 / 官方推荐 | 示例 | 使用场景 / 备注 |
---|
-Xms | 初始堆大小 | 默认物理内存的 1/64 | -Xms512M | 避免频繁扩展堆,提高启动性能 |
-Xmx | 最大堆大小 | 默认物理内存的 1/4 | -Xmx2G | 控制堆最大占用,防止 OOM |
-Xmn | 新生代大小 | 官方推荐为整个堆的 3/8 | -Xmn512M | 调整年轻代比例,影响 Minor GC |
-XX:NewRatio=n | 新生代与老年代比例 | / | -XX:NewRatio=3 | 年轻代占整个堆的 1/(n+1) |
-XX:SurvivorRatio=n | Eden 与 Survivor 比例 | / | -XX:SurvivorRatio=8 | 年轻代中 Eden:Survivor = 8:1:1 |
二、线程与栈相关
参数 | 说明 | 默认 / 官方推荐 | 示例 | 使用场景 / 备注 |
---|
-Xss | 线程堆栈大小 | JDK1.5+ 默认 1M,之前 256k | -Xss512k | 调整线程栈深度,防止 StackOverflowError |
三、永久代 / 元空间相关(JDK8 之前)
参数 | 说明 | 默认 / 官方推荐 | 示例 | 使用场景 / 备注 |
---|
-XX:PermSize=n | 永久代初始大小 | 默认物理内存的 1/64 | -XX:PermSize=128M | 存放类元数据 |
-XX:MaxPermSize=n | 永久代最大大小 | 默认物理内存的 1/4 | -XX:MaxPermSize=256M | 避免 PermGen OOM |
JDK 8 以后使用 Metaspace 替代 PermGen,可用 -XX:MetaspaceSize
/ -XX:MaxMetaspaceSize
配置。
四、垃圾回收(GC)相关
参数 | 说明 | 默认 / 官方推荐 | 示例 | 使用场景 / 备注 |
---|
-verbose:gc | GC 简单日志打印 | / | - | 查看 GC 执行情况 |
-XX:+PrintGC | 打印 GC 日志 | / | - | 基础 GC 日志输出 |
-XX:+PrintGCDetails | 打印详细 GC 日志 | / | - | 包含每代回收情况 |
-XX:+PrintGCDateStamps | GC 日志加时间戳 | / | - | 用于分析 GC 时间线 |
-Xloggc:filename | 指定 GC 日志路径 | / | -Xloggc:/data/jvm/gc.log | 输出到文件便于分析 |
-XX:+UseSerialGC | 年轻代串行收集器 | / | - | 单线程收集,适合小堆或低并发 |
-XX:+UseParallelGC | 年轻代并行收集器 | / | - | 并行 Minor GC,适合多 CPU |
-XX:ParallelGCThreads=n | 并行 GC 线程数 | / | -XX:ParallelGCThreads=4 | 调整 CPU 利用率 |
-XX:MaxGCPauseMillis=n | 最大 GC 停顿时间 | / | -XX:MaxGCPauseMillis=100 | 控制并行收集停顿 |
-XX:GCTimeRatio=n | GC 时间占比 | / | -XX:GCTimeRatio=19 | 程序运行时间占比 1/(1+n) |
-XX:+UseParallelOldGC | 老年代并行收集器 | / | - | 配合 Parallel Scavenge 优化吞吐量 |
-XX:+UseConcMarkSweepGC | 并发老年代收集器 CMS | / | - | 降低 Full GC 停顿时间 |
-XX:+CMSIncrementalMode | CMS 增量模式 | / | - | 单 CPU 场景可降低停顿 |
五、类加载 / 调试相关
参数 | 说明 | 默认 / 官方推荐 | 示例 | 使用场景 / 备注 |
---|
-verbose:class | 打印类加载信息 | / | - | 排查类加载或重复加载问题 |
-XX:+PrintFlagsFinal | 输出所有 JVM 参数值 | / | - | 查看实际生效参数 |
💡 建议使用方法
- 基础排查:启动时设置
-Xms
/ -Xmx
/ -Xmn
并开启 GC 日志,便于排查内存及 GC 问题。 - 性能调优:根据线程数、CPU 核心和应用特性调整 GC 策略和线程栈大小。
- 线上监控:将 GC 日志、类加载日志输出到文件并配合工具分析,如 GCViewer、GCEasy。
JVM 排查工具
工具 | 作用 | 功能 | 示例命令 | 输出关注点 |
---|
jps | JVM Process Status Tool | 显示系统内所有 HotSpot 虚拟机进程 | jps -lv | 进程 PID、启动参数 |
jstat | JVM Statistics Monitoring Tool | GC 监控、性能统计 | jstat -gcutil <pid> 1000 5 | YGC/YGCT, FGC/FGCT, Old 区占用 |
jmap | Memory Map for Java | 内存分析、堆转储 | jmap -histo:live <pid> | 对象数量、内存占用 Top |
jstack | Stack Trace for Java | 线程分析、死锁排查 | jstack -l <pid> > thread.log | 死锁、BLOCKED 或 CPU 占用高线程 |
jinfo | Configuration Info for Java | JVM 配置参数查看 | jinfo -flags <pid> | 堆大小、GC 策略 |
jhat | JVM Heap Dump Browser | heapdump 文件分析 | jhat heapdump.hprof | 启动 HTTP 服务,通过浏览器查看对象分布 |
💡 使用建议:
- 快速定位进程:
jps -lv
- GC & 内存分析:
jstat
+ jmap
- 线程问题 & CPU 高占用:
jstack
- 参数 & 配置检查:
jinfo
- 堆转储深度分析:`jmap + jhat
1. OOM(内存溢出)问题排查
步骤 | 工具/命令 | 说明/关注点 |
---|
1. 持续监控堆内存 | jstat -gcutil <pid> 1000 5 | 观察 YGC/YGCT, FGC/FGCT, Old 区占用率 |
2. 查看内存对象分布 | jmap -histo:live | head -20 | |
3. 生成堆转储文件 | jmap -dump:live,format=b,file=heapdump.hprof <pid> | 用于离线分析内存泄漏 |
4. 分析堆转储 | jhat heapdump.hprof | 启动 HTTP 服务,通过浏览器分析对象引用链 |
2. CPU 高占用排查
步骤 | 工具/命令 | 说明/关注点 |
---|
1. 定位高 CPU 进程 | top -p <pid> 或 top -H -p <pid> | 查看线程 CPU 占用情况 |
2. 获取线程 ID(十进制 → 十六进制) | printf "%x\n" <tid> | jstack 查找对应线程 |
3. 导出线程堆栈 | jstack -l | grep -A 30 | |
4. 分析问题代码 | 根据线程堆栈定位 | 修改代码逻辑或优化算法 |
3. 线程阻塞/死锁排查
步骤 | 工具/命令 | 说明/关注点 |
---|
1. 查看线程快照 | jstack -l <pid> | 查找 BLOCKED 或 WAITING 线程 |
2. 分析锁竞争 | 堆栈信息中查看 synchronized/Lock | 定位锁竞争点 |
3. 高级分析 | jmap -histo:live <pid> | 判断是否存在对象争用导致阻塞 |
4. GC 频繁或长停顿排查
步骤 | 工具/命令 | 说明/关注点 |
---|
1. GC 日志查看 | -XX:+PrintGCDetails -Xloggc:/path/gc.log | 分析 YGC/FGC 次数、耗时 |
2. 实时监控 | jstat -gcutil <pid> 1000 5 | 观察内存占用变化趋势 |
3. 参数优化 | -Xms/Xmx/-XX:NewRatio/-XX:SurvivorRatio | 调整堆大小、代比例、GC 策略 |
5. JVM 参数与配置检查
步骤 | 工具/命令 | 说明/关注点 |
---|
1. 查看 JVM 参数 | jinfo -flags <pid> | 堆大小、GC 策略、线程栈等 |
2. 查看系统资源限制 | ulimit -a | 确保文件描述符、线程数足够 |
3. 查看进程启动信息 | jps -lv | 确认启动参数和 JVM 类型 |
💡 最佳实践总结:
- 排查顺序:先 CPU/线程 → 再 内存/GC → 最后 参数与配置
- 工具组合:
top/jps/jstat/jmap/jstack/jinfo/jhat
- 常用技巧:
- 高 CPU → top + jstack
- 内存问题 → jstat + jmap + jhat
- GC 问题 → jstat + GC 日志分析
- 线下分析:通过
heapdump
离线分析大对象和内存泄漏
常用命令
1. jps(JVM Process Status Tool)
- 作用:列出系统中所有 Java 进程(类似于
ps
命令,但专门针对 JVM)。 - 常用参数:
-l
:显示主类全名或 jar 路径-m
:显示启动参数-q
:只输出 PID(便于结合其他命令使用)
- 典型场景:
- 找出目标 Java 进程的 PID,例如为了用
jstack
或 jmap
分析 - 快速确认哪些 Java 应用在运行
jps -l -m
2. jstat(JVM Statistics Monitoring)
- 作用:监控 JVM 运行时状态,包括内存、GC、类加载、编译等。
- 常用场景:
- 排查内存泄漏、GC 问题
- 监控 Young/Old 区使用情况
- 分析 JIT 编译情况
- 示例:
jstat -gc <pid> 1000
3. jmap(JVM Memory Map)
- 作用:生成堆内存快照(heap dump)。
- 常用场景:
- 排查内存泄漏
- 配合
jhat
分析对象分布 - OOM 触发时自动 dump 堆
- 示例:
jmap -dump:format=b,file=heapdump.hprof <pid>
- 替代方案:
- JVM 参数:
-XX:+HeapDumpOnOutOfMemoryError
,OOM 时自动生成 dump
4. jhat(JVM Heap Analysis Tool)
- 作用:分析
jmap
生成的 heap dump 文件 - 特点:
- 内置微型 HTTP 服务器,可通过浏览器查看分析结果
- 使用流程:
jhat heapdump.hprof
5. jstack(JVM Stack Trace)
- 作用:打印 JVM 当前所有线程的堆栈信息
- 常用参数:
-F
:强制输出线程堆栈(当线程阻塞或响应慢)-l
:显示锁信息-m
:显示 C/C++ 本地方法堆栈
- 典型场景:
jstack -F <pid>
6. jinfo(JVM Configuration info)
- 作用:查看或调整 JVM 参数
- 常用参数:
-flags
:查看 JVM 参数(如堆大小、GC 类型)-flag <name>
:查看指定参数值-sysprops
:查看系统属性(等同 System.getProperties()
)
jinfo -flags <pid>
jinfo -sysprops <pid>
- 典型场景:
- 动态查看 JVM 参数,辅助调优
- 配合其他命令分析性能问题
💡 小结:
- 监控 JVM 状态:
jstat
, jinfo
- 分析线程问题:
jstack
- 分析内存问题:
jmap
, jhat
- 快速找进程:
jps