一、基础命令
jps 查看所有java进程
![](https://img-blog.csdnimg.cn/img_convert/5ba812135445f7536cf92e04e262be2f.png)
jinfo 进程号 查看该线程相关信息
![](https://img-blog.csdnimg.cn/img_convert/1c996e9d74a295669e358fd6be7ca51d.png)
![](https://img-blog.csdnimg.cn/img_convert/f4aa5ce88a3012ae3f17efbf276527c9.png)
3、jstat 统计信息(数据跟踪信息)
jstat -gc 进程号 查看该线程在内存中每一块占用的大小
![](https://img-blog.csdnimg.cn/img_convert/f4d47b66f0215e3fc0f005cd6383fd7e.png)
jstat -gc 进程号 时间(毫秒) 更新频率
![](https://img-blog.csdnimg.cn/img_convert/aaed4a8fd45630fa306ac6e8c7bea0d0.png)
4、jstack 跟踪线程
jstack 进程号
![](https://img-blog.csdnimg.cn/img_convert/ea4ded30f55cc7c6fbec5a3567bf8090.png)
![](https://img-blog.csdnimg.cn/img_convert/ee364563a8ef4fffca8436717ada9b9d.png)
top 查看当前系统中每个进程占用cpu和内存的信息
![](https://img-blog.csdnimg.cn/img_convert/b47f7c62ff3b8d115f553af487f4634a.png)
top -Hp 进程号 查看当前进程中所有线程的CPU和内存占用情况
![](https://img-blog.csdnimg.cn/img_convert/e261c37e328a6cf670d9573c3839be05.png)
CPU飚高生产环境解决思路:
top 查看所有进程中CPU最高的,拿到进程编号
top -HP 进程编号 找到CPU占用最高的线程,拿到线程编号
jstack 进程号 与上一步拿到的线程编号进行对应
看看有问题的线程到底是哪个
找到之后判断起始GC线程还是业务线程
业务线程:查看业务线程中调用了哪些方法,看是哪个方法不断循环占用CPU
GC线程:一定是在频繁的GC,排查原因是什么?
例:双十一秒杀来了一大波流量,撑不住扩机器;内存回收来会回收去总是回收不掉,这种情况就是有内存泄漏
频繁Full GC
6、jmap
作用一:查看堆内存中哪些对象占用情况
jmap -histo 进程号
![](https://img-blog.csdnimg.cn/img_convert/5f4cd279ac3144f6d442b035a535d38c.png)
jmap -histo 4878 | head -20
20表示取前20行
![](https://img-blog.csdnimg.cn/img_convert/bae3656a53fe13dcc6a9b2bfcbb7e0ce.png)
对比两次GC后对象数量
![](https://img-blog.csdnimg.cn/img_convert/7b5ecbe73e0d388792e19f8fba48e305.png)
注意:JMAP命令不能再生产环境直接执行,会stp拿出当前进程所有对象信息
方法1:来的访问复制一份,摘下来执行
方法2:测试环境压测
作用二:产生堆内存存储文件
jmap -dump:format=b,file=20230301.hprof 进程号
![](https://img-blog.csdnimg.cn/img_convert/f3a6e11d15933bf5585791da08fd4f0f.png)
文件分析工具可以使用jdk自带的
图形界面工具jvisualvm
![](https://img-blog.csdnimg.cn/img_convert/bc1d9a6f67f2536cea647120594d2b9d.png)
可以直接读取jmap导出的文件分析,也可以远程连接LInux服务器分析排查问题
图形界面中分析出问题
压测环境中观察出问题
机器做了负载均衡,摘出其中一台,导出其堆存储文件
TCP down复制一份到生产环境,另一份到测试环境
图形界面工具:arthas 阿里开源
1、arthas启动方式 java -jar arthas-boot.jar
help :查看arthas所有命令
![](https://img-blog.csdnimg.cn/img_convert/1231bf6b0fb98f8bbf1a9f252348c668.png)
dashboard :(仪表盘)
![](https://img-blog.csdnimg.cn/img_convert/6b41fc6d0e8a5f974f020d3f146f4f09.png)
heap dump =》 jmap
thread 列出当前进程所有线程占用CPU和内存情况
![](https://img-blog.csdnimg.cn/img_convert/f908c454afd39cfdc0ce7b500a589ef8.png)
thread -b 寻找死锁
jvm 查看各参数设置 =》 jinfo
![](https://img-blog.csdnimg.cn/img_convert/10c35197d632519c8efd94473b015d80.png)
more 类名.java 读取java文件
jad 类名 反编译
![](https://img-blog.csdnimg.cn/img_convert/93934c4834475c459260a3ce32c54aa9.png)
redefine 定义class
可以在不停止项目的情况下,修改java文件,通过javac 类名.java编译 再通过redefine 定义class上传到远程
trace 类名 方法名 :查看该方法执行时间
![](https://img-blog.csdnimg.cn/img_convert/af3f167d1425e744edba1f9a8fa05c76.png)