Java中的常见排查问题命令
一、线上服务排查,从三个方面负载、cpu、内存 这三个方面着手
1:top 命令是比较常见的,也是最常用的,因为他显示的信息也是最全的
2:针对负载的问题,我们怎么能确定负载当前是高还是低?
一般来说只要负载超过0.7可能就表示当前负载有点高了,需要排查一下,这个是针对单核CPU来说的,如果是多核CPU来说,我们就是CPU核数乘以0.7来计算的。
在top显示的进程信息的时候,我们可能看到当前进程中 7704这个进程 占用CPU最高,而且是我们的Java进程
3:top -Hp 是查看当前进程中的所有的线程情况,同样的可以看到 9046 这个线程占用比较高,那么我们再接着分析这个线程在处理什么逻辑就可以了
4:使用printf命令查看这个线程的16进制
5:最后使用jstack命令查看当前线程正在执行的什么方法,再或者我们直接使用 jmap 来dump内存
6:free来查看内存数据,是保证我们程序能正常运行的关键,这个也是需要我们查看的一个关键指标数据
A: Mem行,顾名思义也就是展示内存的使用情况
a: total:表示物理内存总大小
b: used:已经被使用的物理内存和交换空间
c: free:表示未被分配的内存
d: shared:共享使用的物理内存大小
e: buff/cache buffer 和 cache 使用的物理内存大小
f: available:当前剩余实际可用内存(还可以被应用程序使用的物理内存大小)
7: vmstat命令用于查看CPU使用情况
a: us:用户进程执行时间百分比(如果当前值比较高,说明用户进程消耗高)
b: sy:内核系统进程执行时间百分比(如果系统比较高,那么你可以找运维了)
c: id:空闲时间百分比
d: wa:IO等待时间百分比(如果IO时间长,那说明机器在大量的处理磁盘的读写操作,这个也是关注的重点,可能写日志啊等都有可能)
e: st:虚拟 CPU 等待实际 CPU 的时间的百分比
二、将内存使用情况加载到dump文件中
方法一:
jmap -dump:format=b,file=dumpFileName <pid>
#示例
jmap -dump:format=b,file=/tmp/dump.dat 6219
![](https://img2020.cnblogs.com/blog/2032084/202111/2032084-20211105230757990-608498056.png)
方法二:Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态
A:安装一下Arthas:$curl -O https://arthas.aliyun.com/arthas-boot.jar
B: 启动Arthas前,必须先要启动所要监控的服务
C:生成dump文件并到指定到相关位置上
三、解析dump文件,可以使用 MAT、Jprofiler等