转载:Java线上问题如何排查处理?

本文转载于:这里

一.Java线上问题处理流程.

   这里主要包含三步,通常的应用程序都适用于此步骤,而我们首先要做的就是快速恢复,其次才是问题的解决.

  1. 快速恢复
  2. 问题定位和解决
  3. 问题防范

   本篇文章主要侧重于问题的定位,当线上应用程序出现问题时,我们怎么去找到问题出现的根源.

二.问题定位

   当线上程序应用出现问题时,第一还是要查看日志,通常情况下日志还是能直观反应出问题所在(如果没有反应出,那小伙伴们可能就需要反思自己日志是否添加得当)
   然而,在某些情况下日志反应不了对应的问题,我们就需要自己进行排查,也是本篇文章所写目的所在.在排查时主要有三个步骤,机器层面,进程层面和线程层面.

1.机器层面.

(1)查看机器cpu占用.

命令:top
在这里插入图片描述
us 用户空间占用CPU百分比:  7.3%
sy 内核空间占用CPU百分比:  2.0%
ni 用户进程空间内改变过优先级的进程占用CPU百分比:  0.0%
id 空闲CPU百分比:  90.4%
wa 等待输入输出的CPU时间百分比;  0.3%

load average :当前系统负载的平均值,后面的三个值分别为1分钟前、5分钟前、15分钟前进程的平均数,一般的可以认为这个数值超过 CPU 数目时,CPU 将比较吃力的负载当前系统所包含的进程

(2).查看机器内存使用:

命令:free -h
在这里插入图片描述 total:总计物理内存的大小。
used:已使用多大。
free:可用有多少。
Shared:多个进程共享的内存总额。
Buffers/cached:磁盘缓存的大小。

(3)查看机器硬盘使用:

命令:df -h
在这里插入图片描述

(4)查看机器网络IO情况:

命令:iostat
在这里插入图片描述
在这里插入图片描述

2.进程层面(整体情况).

(1)首先获取进程ID.

命令: ps -ef | grep 应用名
在这里插入图片描述

(2)查看进程所占用cpu和内存

命令:ps -aux | grep 进程ID
在这里插入图片描述
USER : 用户
PID : 进程号
%CPU : 执行命令时候进程占用的CPU百分比
%MEM : 执行命令时候进程占用的内存百分比
VSZ : 进程占用虚拟内存(一般不用关注)
RSS : 进程占用物理内存(实际占用内存,单位KB)
TTY : 终端号

3.线程层面和进程内部内存使用分析.

(1).查看线程正在干什么,也就是线程快照.

命令:jstack 进程ID
在这里插入图片描述

(2)JVM老年代,新生代使用情况.

命令:jmap -heap 进程ID.
该命令会打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息
在这里插入图片描述
在这里插入图片描述

(3)查看哪个类使用内存最多

命令:jmap -histo:live 进程ID
在这里插入图片描述

(4)查看详细GC情况.

命令:jstat -gcutil 进程ID
在这里插入图片描述
S0,S1 表示Survivor区
E表示Eden(新生代),
O表示Old(老年代),
M表示Metaspace(元空间),
YGC(Minor GC次数),
YGCT( Minor GC耗时,单位:秒),
FGC(Full GC次数),
FGCT(Full GC耗时,单位:秒),
GCT(GC耗时)

注意:上面两个YGCT,FGCT是新生代和老年代各自执行的gc的总的时间,如果需要算Full GC平均时间,则需要用FGCT/FGC,如果平均时间大于1s,则需要考虑优化了.

经过以上步骤基本能定位到问题,如果在过程中定位到比如说CPU占用过高OOM或者是内存溢出,可以在该文章查看详细步骤:OOM与CPU占用过高分析

猜你喜欢

转载自blog.csdn.net/qq_36256590/article/details/132433302