JVM调优实战
JVM调优实战
1.常用命令
-
jps
jps -ml
显示java进程信息
-
jinfo 进程号
显示这个进程的运行的java程序的信息
-
jstat -gc 进程号
显示内存每块区域占用的大小
jstat -gcutil 进程号
显示内存每块区域占用的百分比大小
jstat -gc 进程号 时间
每 时间(ms)显示当前内存每块区域占用的大小
-
jstack 进程号
显示进程号里所有的线程信息
-
jmap
- jmap命令会STOP THE WORLD停止整个jvm内存情况保持不变。导致程序卡死(直接查看还是生成dump文件都会卡死),不能在线上使用啊!!!!
jmap -histo 进程号
生产当前jvm所有对象的 创建数量 和 占用内存数量
jmap -histo 进程号 | head -20 显示前20行
(可以不断查看,发现哪些对象在GC后还一直加,无法回收)
jmap -dump:format=b,file=20241117.hprof 进程号
生成内存情况转储文件20241117.hprof,用工具去分析
jmap -histo 进程号 | head -20 | awk '{ print($1, $2, $3, $3/1024/1024, $4) }'
变成以MB为单位 $3/1024/1024
jmap -histo 进程号 | head -20 | awk '{ printf("%-10s %-10s %-10s %-10s %-10s\n", $1, $2, $3, $3/1024/1024, $4) }'
结果格式化
系统级别的命令
-
top
显示所有进程的CPU和内存占用情况
运行top后按大键盘1看看,可以显示每个cpu的使用率,top里显示的是把所有使用率加起来。
注意:
按下1后显示的是逻辑cpu的个数,并不代表cpu的真实核数。附录一:查看CPU核数、查看CPU型号 (https://blog.csdn.net/wngpenghao/article/details/126102303)
-
top -Hp 进程号
显示进程号的所有的线程CPU和内存占用情况
2.实战
假如JVM占用很高的CPU,怎么查问题出在哪里?
-
先用top命令 找出哪个进程cpu占用最高
-
再用top -Hp 进程号 找出哪个线程cpu占用最高pid pid是十进制 转成十六进制和下面stack的nid对应
-
用jstack 进程号查看所有线程信息,找到刚刚cpu占用最高的线程对应的信息 nid=0x9d85
-
判断这个线程类型
- VM线程(GC线程):应该是不断 Full GC,频繁占用CPU,看GC日志,确认是否是这样?
- 为什么不断GC?内存太小?内存泄漏?
- 业务线程:看业务线程调用了哪些方法?不断循环占用内存?
- VM线程(GC线程):应该是不断 Full GC,频繁占用CPU,看GC日志,确认是否是这样?
-
FUll GC是否正常:
-
假如回收前200M,回收后就是1M,回收了199M,这样是正常的。因为客户端来的流量太大了,就应该去回收。
- 这时应该去扩大内存
-
每次回收就几k,那就是有问题,去生成dump文件分享
-
-
使用jvisualvm进行dump分析
3.Arthas
Arthas命令
- dashboard
- heap dump
- thread
- jvm
- jad
- redefine
- trace
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步