当前位置: 首页 > news >正文

JVM参数及问题排查工具

文章目录

  • 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=nEden 与 Survivor 区比例/-XX:SurvivorRatio=8年轻代中 Eden:Survivor = 8:1:1
-XX:PermSize=n永久代初始大小默认物理内存的 1/64-XX:PermSize=128MJDK8 之前,存放类元数据
-XX:MaxPermSize=n永久代最大大小默认物理内存的 1/4-XX:MaxPermSize=256M避免 PermGen OOM
-verbose:class类加载信息打印/-用于排查类加载问题
-verbose:gcGC 日志打印/-简单了解 GC 执行情况
-XX:+PrintGC打印 GC 日志/-基础 GC 日志输出
-XX:+PrintGCDetails打印详细 GC 日志/-包含每代回收情况
-XX:+PrintGCDateStampsGC 日志时间戳/-便于分析 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=nGC 时间占比/-XX:GCTimeRatio=19程序运行时间占比 1/(1+n)
-XX:+UseParallelOldGC老年代并行收集器/-配合 Parallel Scavenge 使用,适合吞吐量优化
-XX:+UseConcMarkSweepGCCMS 并发老年代收集器/-降低 Full GC 停顿时间
-XX:+CMSIncrementalModeCMS 增量模式/-单 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=nEden 与 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:gcGC 简单日志打印/-查看 GC 执行情况
-XX:+PrintGC打印 GC 日志/-基础 GC 日志输出
-XX:+PrintGCDetails打印详细 GC 日志/-包含每代回收情况
-XX:+PrintGCDateStampsGC 日志加时间戳/-用于分析 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=nGC 时间占比/-XX:GCTimeRatio=19程序运行时间占比 1/(1+n)
-XX:+UseParallelOldGC老年代并行收集器/-配合 Parallel Scavenge 优化吞吐量
-XX:+UseConcMarkSweepGC并发老年代收集器 CMS/-降低 Full GC 停顿时间
-XX:+CMSIncrementalModeCMS 增量模式/-单 CPU 场景可降低停顿

五、类加载 / 调试相关

参数说明默认 / 官方推荐示例使用场景 / 备注
-verbose:class打印类加载信息/-排查类加载或重复加载问题
-XX:+PrintFlagsFinal输出所有 JVM 参数值/-查看实际生效参数

💡 建议使用方法

  1. 基础排查:启动时设置 -Xms / -Xmx / -Xmn 并开启 GC 日志,便于排查内存及 GC 问题。
  2. 性能调优:根据线程数、CPU 核心和应用特性调整 GC 策略和线程栈大小。
  3. 线上监控:将 GC 日志、类加载日志输出到文件并配合工具分析,如 GCViewer、GCEasy。

JVM 排查工具

工具作用功能示例命令输出关注点
jpsJVM Process Status Tool显示系统内所有 HotSpot 虚拟机进程jps -lv进程 PID、启动参数
jstatJVM Statistics Monitoring ToolGC 监控、性能统计jstat -gcutil <pid> 1000 5YGC/YGCT, FGC/FGCT, Old 区占用
jmapMemory Map for Java内存分析、堆转储jmap -histo:live <pid>对象数量、内存占用 Top
jstackStack Trace for Java线程分析、死锁排查jstack -l <pid> > thread.log死锁、BLOCKED 或 CPU 占用高线程
jinfoConfiguration Info for JavaJVM 配置参数查看jinfo -flags <pid>堆大小、GC 策略
jhatJVM Heap Dump Browserheapdump 文件分析jhat heapdump.hprof启动 HTTP 服务,通过浏览器查看对象分布

💡 使用建议

  1. 快速定位进程jps -lv
  2. GC & 内存分析jstat + jmap
  3. 线程问题 & CPU 高占用jstack
  4. 参数 & 配置检查jinfo
  5. 堆转储深度分析:`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 类型

💡 最佳实践总结

  1. 排查顺序:先 CPU/线程 → 再 内存/GC → 最后 参数与配置
  2. 工具组合top/jps/jstat/jmap/jstack/jinfo/jhat
  3. 常用技巧
    • 高 CPU → top + jstack
    • 内存问题 → jstat + jmap + jhat
    • GC 问题 → jstat + GC 日志分析
  4. 线下分析:通过 heapdump 离线分析大对象和内存泄漏

常用命令

1. jps(JVM Process Status Tool)

  • 作用:列出系统中所有 Java 进程(类似于 ps 命令,但专门针对 JVM)。
  • 常用参数
    • -l:显示主类全名或 jar 路径
    • -m:显示启动参数
    • -q:只输出 PID(便于结合其他命令使用)
  • 典型场景
    • 找出目标 Java 进程的 PID,例如为了用 jstackjmap 分析
    • 快速确认哪些 Java 应用在运行
jps -l -m

2. jstat(JVM Statistics Monitoring)

  • 作用:监控 JVM 运行时状态,包括内存、GC、类加载、编译等。
  • 常用场景
    • 排查内存泄漏、GC 问题
    • 监控 Young/Old 区使用情况
    • 分析 JIT 编译情况
  • 示例
jstat -gc <pid> 1000
# 每 1 秒输出一次 GC 状态

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
# 打开浏览器访问 http://localhost:7000 查看对象分布

5. jstack(JVM Stack Trace)

  • 作用:打印 JVM 当前所有线程的堆栈信息
  • 常用参数
    • -F:强制输出线程堆栈(当线程阻塞或响应慢)
    • -l:显示锁信息
    • -m:显示 C/C++ 本地方法堆栈
  • 典型场景
    • 排查死锁
    • 线程阻塞或高 CPU 的线程分析
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

http://www.dtcms.com/a/431976.html

相关文章:

  • 全部网站网站开发需要哪些基础技术
  • (基于江协科技)51单片机入门:9.蜂鸣器
  • 服装网站建设报关微信公众号平台网站开发
  • 旧金山网站建设互联网公司加盟
  • Pod 介绍
  • 全国商城网站建设石大网页设计与网站建设客观题
  • 广西钦州有人帮做网站的公司吗wordpress必须安装php吗
  • 深入解析Kerberos协议攻击手法:从基础到高级攻防实战
  • 现在网站建站的主流语言是什么东莞品牌网站建设费用
  • NO.10数据结构图|Prim算法|Kruskal算法|Dijkstra算法|Floyd算法|拓扑排序|关键路径
  • 深圳市西特塔网站建设工作室wordpress 本地访问慢
  • 网站制作的发展趋势网站文件目录
  • 旅游公网站如何做室内设计效果图怎么画
  • Acrobat DC 文本域表单验证中的 js 使用
  • 商务网站开发代码h网站建设
  • 动态规划完整入门
  • 网站怎么做端口映射想访问国外网站 dns
  • 【Linux系列】并发世界的基石:透彻理解 Linux 进程 —— 从调度到通信的深度实践
  • 专业设计网站排名网站建设忄金手指快速
  • 怎么申请自己的网站网址网站建设响应
  • 西部数码网站管理助手serv-u默认密码杭州seo网站推广排名
  • 好的网站具备什么条件网站运营建设方案
  • 简单好看个人主页网站模板建设方案模板
  • gRPC从0到1系列【11】
  • 自助建站系拟采用建站技术
  • 如何做网站推广优化好的漂亮的淘宝客网站
  • 沈阳市做网站的公司准备建网站该怎么做
  • 多线程—阻塞队列的练习
  • C#基础10-结构体和枚举
  • 网站建设 福田东莞推广系统怎么做