一、线上服务排查,从三个方面负载、cpu、内存 这三个方面着手

1:top 命令是比较常见的,也是最常用的,因为他显示的信息也是最全的

java线程轮询 java线程问题排查_执行时间

java线程轮询 java线程问题排查_物理内存_02

2:针对负载的问题,我们怎么能确定负载当前是高还是低?

    一般来说只要负载超过0.7可能就表示当前负载有点高了,需要排查一下,这个是针对单核CPU来说的,如果是多核CPU来说,我们就是CPU核数乘以0.7来计算的。
    在top显示的进程信息的时候,我们可能看到当前进程中 7704这个进程 占用CPU最高,而且是我们的Java进程


3:top -Hp 是查看当前进程中的所有的线程情况,同样的可以看到 9046 这个线程占用比较高,那么我们再接着分析这个线程在处理什么逻辑就可以了

java线程轮询 java线程问题排查_java线程轮询_03

4:使用printf命令查看这个线程的16进制

java线程轮询 java线程问题排查_java线程轮询_04

5:最后使用jstack命令查看当前线程正在执行的什么方法,再或者我们直接使用 jmap 来dump内存

java线程轮询 java线程问题排查_执行时间_05

6:free来查看内存数据,是保证我们程序能正常运行的关键,这个也是需要我们查看的一个关键指标数据

java线程轮询 java线程问题排查_执行时间_06

A: Mem行,顾名思义也就是展示内存的使用情况

          a:  total:表示物理内存总大小
          b:  used:已经被使用的物理内存和交换空间
          c:  free:表示未被分配的内存
          d:  shared:共享使用的物理内存大小
          e:  buff/cache buffer 和 cache 使用的物理内存大小
          f:  available:当前剩余实际可用内存(还可以被应用程序使用的物理内存大小)

 7: vmstat命令用于查看CPU使用情况

java线程轮询 java线程问题排查_java线程轮询_07

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://img57990-608498056.png)


           方法二:Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态

                A:安装一下Arthas:$curl -O https://arthas.aliyun.com/arthas-boot.jar

java线程轮询 java线程问题排查_执行时间_08

B: 启动Arthas前,必须先要启动所要监控的服务

java线程轮询 java线程问题排查_java线程轮询_09

C:生成dump文件并到指定到相关位置上

java线程轮询 java线程问题排查_java线程轮询_10

三、解析dump文件,可以使用 MAT、Jprofiler等