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