32人参与 • 2026-09-11 • 其他编程
查看 java 进程。
jps -l # 显示完整类名 jps -v # 显示 jvm 参数 jps -m # 显示 main 方法参数 # 输出示例 12345 com.example.myapp 12346 org.apache.catalina.startup.bootstrap
监控 jvm 统计信息。
# 查看 gc 情况 jstat -gc <pid> 1000 10 # 每秒输出一次,共 10 次 # 输出字段 s0c/s1c # survivor 区容量 s0u/s1u # survivor 区使用量 ec/eu # eden 区容量/使用量 oc/ou # 老年代容量/使用量 mc/mu # 元空间容量/使用量 ygc/ygct # young gc 次数/时间 fgc/fgct # full gc 次数/时间 gct # 总 gc 时间 # 查看类加载 jstat -class <pid> # 查看编译 jstat -compiler <pid>
查看和修改 jvm 配置。
# 查看所有参数 jinfo <pid> # 查看特定参数 jinfo -flag maxheapsize <pid> # 动态修改参数(部分参数支持) jinfo -flag +printgcdetails <pid>
生成堆转储快照。
# 查看堆使用情况 jmap -heap <pid> # 查看对象分布 jmap -histo <pid> | head -20 # 生成 heap dump jmap -dump:format=b,file=heap.hprof <pid> # 生成时压缩 jmap -dump:live,format=b,file=heap.hprof <pid>
生成线程转储快照。
# 查看所有线程 jstack <pid> # 查找死锁 jstack <pid> | grep -a 20 "deadlock" # 导出到文件 jstack <pid> > thread_dump.txt # 查看 native 栈 jstack -m <pid>
线程状态:
runnable:运行中或可运行blocked:等待获取锁waiting:无限期等待(wait() / park())timed_waiting:限时等待(sleep() / wait(timeout))综合诊断工具(jdk 7+)。
# 列出所有诊断命令 jcmd <pid> help # 查看堆信息 jcmd <pid> gc.heap_info # 触发 gc jcmd <pid> gc.run # 生成 heap dump jcmd <pid> gc.heap_dump /path/to/heap.hprof # 查看线程 jcmd <pid> thread.print # 查看类加载 jcmd <pid> vm.class_hierarchy
jdk 自带的图形化监控工具。
jconsole
功能:
更强大的图形化工具(jdk 8 内置,jdk 11+ 需单独下载)。
功能:
eclipse 提供的内存分析工具。
下载地址:www.eclipse.org/mat/
功能:
使用步骤:
.hprof 文件线上诊断神器。
下载地址:arthas.aliyun.com/
启动:
java -jar arthas-boot.jar
常用命令:
# 查看 dashboard
dashboard
# 监控方法调用
monitor com.example.myclass mymethod
# 追踪方法调用链路
trace com.example.myclass mymethod
# 查看方法参数和返回值
watch com.example.myclass mymethod '{params, returnobj}'
# 热更新代码
redefine /path/to/myclass.class
# 查看线程
thread
thread -b # 查找阻塞其他线程的线程
# 查看 jvm 信息
vmoption
sysprop
sysenv
排查步骤:
# 1. 找到 cpu 高的 java 进程 top # 2. 查看进程中 cpu 高的线程 top -h -p <pid> # 3. 将线程 id 转换为 16 进制 printf "%x\n" <tid> # 4. 查看线程栈 jstack <pid> | grep <16进制tid> -a 20 # 5. 分析代码,找出死循环或频繁计算
排查步骤:
# 1. 监控堆内存趋势 jstat -gc <pid> 1000 # 2. oom 时生成 heap dump -xx:+heapdumponoutofmemoryerror -xx:heapdumppath=/path/to/heap.hprof # 3. 手动生成 dump jmap -dump:live,format=b,file=heap.hprof <pid> # 4. 用 mat 分析 # - 查看 dominator tree # - 查找占用内存最多的对象 # - 分析引用链
排查步骤:
# 1. 生成线程转储 jstack <pid> > thread_dump.txt # 2. 查找死锁信息 grep -a 20 "deadlock" thread_dump.txt # 3. 或者用 jconsole / visualvm 的死锁检测功能 # 4. 分析持锁关系,修复代码
死锁示例输出:
found one java-level deadlock: ============================= "thread-1": waiting to lock monitor 0x00007f... (object 0x000000..., a java.lang.object), which is held by "thread-0" "thread-0": waiting to lock monitor 0x00007f... (object 0x000000..., a java.lang.object), which is held by "thread-1"
排查步骤:
# 1. 查看 gc 日志 jstat -gc <pid> 1000 # 2. 分析 gc 原因 # - 老年代满?→ 增大堆或优化对象生命周期 # - 元空间满?→ 增大 metaspace # - system.gc()?→ 检查代码或添加 -xx:+disableexplicitgc # 3. 生成 heap dump 分析 jmap -dump:live,format=b,file=heap.hprof <pid> # 4. 优化建议 # - 减少大对象创建 # - 对象池复用 # - 调整新生代大小
排查步骤:
# 1. 查看线程数 jstack <pid> | grep "java.lang.thread.state" | wc -l # 2. 查看线程详情 jstack <pid> > thread_dump.txt # 3. 分析线程类型 # - 业务线程过多?→ 检查线程池配置 # - waiting 线程过多?→ 检查是否有资源等待 # - blocked 线程过多?→ 检查锁竞争 # 4. 优化建议 # - 使用线程池 # - 减少锁粒度 # - 异步化处理
# 追踪方法执行时间
trace com.example.orderservice createorder
# 输出示例
`---ts=2024-01-01 12:00:00;thread_name=http-nio-8080-exec-1;id=1a;is_daemon=true;priority=5;
`---[0.523ms] com.example.orderservice:createorder()
+---[0.012ms] validateorder()
+---[0.456ms] savetodatabase() ← 慢
`---[0.055ms] sendnotification()
# 监控方法调用
watch com.example.userservice getuser '{params, returnobj}' -x 2
# 输出示例
method=com.example.userservice.getuser location=atexit
ts=2024-01-01 12:00:00; [cost=0.234ms]
param[0]=12345
return=@user[id=12345,name=alice,email=alice@example.com]
# 1. 编译新代码 javac -cp app.jar myclass.java # 2. 上传到服务器 # 3. 热更新 redefine /path/to/myclass.class # 4. 验证
注意:只能修改方法体,不能修改方法签名、字段、继承关系。
# 查看 jvm 参数 vmoption # 查看系统属性 sysprop # 查看环境变量 sysenv
q1:如何排查 cpu 飙高问题?
top 找到 cpu 高的进程top -h -p <pid> 找到 cpu 高的线程printf "%x" 转换线程 id 为 16 进制jstack 查看线程栈q2:如何排查内存泄漏?
q3:jstack 和 jmap 的区别?
jstack:生成线程转储,查看线程状态、死锁jmap:生成堆转储,查看对象分布、内存泄漏q4:什么是 heap dump 和 thread dump?
q5:arthas 的优势是什么?
q6:full gc 频繁怎么排查?
q7:如何预防死锁?
trylock 超时jstack 定期检测q8:生产环境如何监控 jvm?
jstat、jmap、jstack以上就是jvm性能调优必备之监控与故障排查工具使用教学的详细内容,更多关于jvm监控与故障排查工具的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论