文章目录

  • 一.Java线上问题处理流程.
  • 二.问题定位
  • 1.机器层面.
  • (1)查看机器cpu占用.
  • (2).查看机器内存使用:
  • (3)查看机器硬盘使用:
  • (4)查看机器网络IO情况:
  • 2.进程层面(整体情况).
  • (1)首先获取进程ID.
  • (2)查看进程所占用cpu和内存
  • 3.线程层面和进程内部内存使用分析.
  • (1).查看线程正在干什么,也就是线程快照.
  • (2)JVM老年代,新生代使用情况.
  • (3)查看哪个类使用内存最多
  • (4)查看详细GC情况.


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

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

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

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

二.问题定位

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

1.机器层面.

(1)查看机器cpu占用.

命令:top

java程序线上 java线上问题_java


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

java程序线上 java线上问题_老年代_02

total:总计物理内存的大小。

used:已使用多大。

free:可用有多少。

Shared:多个进程共享的内存总额。

Buffers/cached:磁盘缓存的大小。

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

命令:df -h

java程序线上 java线上问题_java_03

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

命令:iostat

java程序线上 java线上问题_jvm_04


java程序线上 java线上问题_oom_05

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

(1)首先获取进程ID.

命令: ps -ef | grep 应用名

java程序线上 java线上问题_java程序线上_06

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

命令:ps -aux | grep 进程ID

java程序线上 java线上问题_oom_07


USER : 用户

PID : 进程号

%CPU : 执行命令时候进程占用的CPU百分比

%MEM : 执行命令时候进程占用的内存百分比

VSZ : 进程占用虚拟内存(一般不用关注)

RSS : 进程占用物理内存(实际占用内存,单位KB)

TTY : 终端号

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

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

命令:jstack 进程ID

java程序线上 java线上问题_jvm_08

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

命令:jmap -heap 进程ID.

该命令会打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息

java程序线上 java线上问题_java程序线上_09


java程序线上 java线上问题_老年代_10

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

命令:jmap -histo:live 进程ID

java程序线上 java线上问题_java程序线上_11

(4)查看详细GC情况.

命令:jstat -gcutil 进程ID

java程序线上 java线上问题_oom_12


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或者是内存溢出