原文网址:Java问题排查系列--线上问题排查的方法/步骤_IT利刃出鞘的博客-CSDN博客

简介

本文介绍如何排查Java的线上问题。包括:如何得知线上出问题了,线上排查步骤简述,CPU、内存、磁盘、网络、垃圾回收、死锁的详细排查步骤。

线上问题排查简介

如何得知线上出问题了?

线上出问题时,我们需要进行详细排查,一般情况下,有以下场景我们可以得知线上出问题了:

  1. 用户反馈功能不能正常使用
  2. 监控系统的邮件或者短信提醒

线上排查步骤

以下按顺序进行

  1. 是否CPU占用过高
  2. 是否内存占用过高
  3. 是否磁盘占用过高
  4. 是否网络故障
  5. 查看后台日志
  6. 是否是数据库问题(比如:索引失效、死锁)
  7. 是否是垃圾回收导致
  8. 是否死锁等

CPU占用过高

什么场景需要排查CPU占用?

  1. 访问接口的响应速度很慢。
  2. 系统崩溃无响应
  3. 压测时要查看CPU、内存、load、rt、qps等指标

步骤简述

  1. 定位进程         (命令:top)
  2. 定位线程         (命令:top -Hp 进程号)
  3. 定位代码位置  (命令:jstack)

排查方法详述

  1. 找到占CPU最高的进程。

    1. top命令,记下进程号(PID)。假设最高的是:1893
  2. 通过进程找到对应的线程。
    1. top -Hp 1893。假设最高的是:4519
    2. (因为Java是单进程多线程的)
  3. 通过线程定位到代码大概的位置信息。
    1. printf %x 4519。结果为:11a7
    2. jstack 1893 | grep  11a7 -A 30 --color
        结果大概是这样的:

可能导致CPU使用率飙升的操作

  1. 无限循环的while
  2. 经常使用Young GC
  3. 频繁的GC
    如果访问量很高,可能会导致频繁的GC甚至Full GC。当调用量很大时,内存分配将如此之快以至于GC线程将连续执行,这将导致CPU飙升。
  4. 序列化和反序列化
    1. 稍后将给出一个示例:当程序执行xml解析时,调用量会增加,从而导致CPU变满。
  5. 正则表达式
    1. 我遇到了正则表达式使CPU充满的情况; 原因可能是Java正则表达式使用的引擎实现是NFA自动机,它将在字符匹配期间执行回溯。我写了一篇文章“ 正则表达式中的隐藏陷阱 ”来详细解释原因。
  6. 线程上下文切换。
    1. 有许多已启动的线程,这些线程的状态在Blocked(锁定等待,IO等待等)和Running之间发生变化。当锁争用激烈时,这种情况很容易发生。

内存占用过高

步骤简述

定位Java程序内存使用过高或者内存泄漏的问题跟CPU也类似,可分为以下步骤:

  1. 定位进程         (命令:top)
  2. 定位线程         (命令:top -Hp 进程号)
  3. 定位代码位置  (命令:jmap生成快照,MAT / jprofiler / VisualVM / jhat 查看快照数据)

1.定位进程

  1. top
  2. 按下M(按内存占用由大到小排序)
    1. // 假设定位到的进程ID为14279。

2.定位线程

top -Hp 14279;

按下M(按内存占用由大到小排序)

top - 18:33:07 up 25 days,  7:48,  1 user,  load average: 0.17, 0.27, 0.23
Threads:  54 total,   1 running,  53 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.5 us,  0.7 sy,  0.0 ni, 98.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8168236 total,   231696 free,  3660496 used,  4276044 buff/cache
KiB Swap:   969964 total,   969964 free,        0 used.  4197860 avail MemPID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
14293 weiping   20   0 4508772  97036  18112 S  10    12 152:35.42 java
14279 weiping   20   0 4508772  97036  18112 S  5.0  1.2   0:00.00 java
14282 weiping   20   0 4508772  97036  18112 S  0.0  1.2   0:00.37 java

注意观察两点:

  1. 线程的数量

    1. 可以看到,它线程数是54(左上角的Threads项),属于正常。
    2. 若比较大(比如大于1000),要考虑是不是代码有问题:
      1. 是不是代码里手动起了多个线程。比如:使用OkHttpClient时每次都创建了连接池(ConnectionPool);应该是只创建一个连接池的。
      2. 是不是自己创建的线程池最大个数太大了。
  2. 占内存大的线程的PID
    1. 如果线程数量正常,就要dump内存的快照信息来查看。

3.定位代码位置

如果是线上环境,注意dump之前必须先将流量切走,否则大内存dump是直接卡死服务。

dump当前快照:jmap -dump:format=b,file=dump.hprof 14279

查找实例数比较多的业务相关的实例,然后找到相应代码查看。(使用工具查看dump.hprof。比如:MAT、VisualVM、jhat)

磁盘问题

步骤简介

  1. 是否磁盘快用完了(命令:df、du)
  2. TPS是否正常(命令:iostat、vmstat、lsof)

1. 磁盘快用尽

df、du 查看磁盘使用情况。见:Linux命令--查看磁盘--df/du--使用/教程/示例_IT利刃出鞘的博客-CSDN博客

2. TPS

iostat查看tps。见:Linux命令--统计磁盘与CPU--iostat--使用/教程/实例_IT利刃出鞘的博客-CSDN博客

网络问题

dstat或者netstat

dstat -n

netstat

垃圾回收

什么情况下,GC会对程序产生影响?

不管Minor GC还是FGC,都会造成一定程度的程序卡顿(即Stop The World:GC线程开始工作,其他工作线程被挂起),即使采用ParNew、CMS或者G1这些更先进的垃圾回收算法,也只是在减少卡顿时间,而并不能完全消除卡顿。

那到底什么情况下,GC会对程序产生影响呢?根据严重程度从高到底,包括以下4种情况:

  1. FGC过于频繁

    1. FGC通常比较慢,少则几百毫秒,多则几秒,正常情况FGC每隔几个小时甚至几天才执行一次,对系统的影响还能接受。
    2. 一旦出现FGC频繁(比如几十分钟执行一次),是存在问题的,会导致工作线程频繁被停止,让系统看起来一直有卡顿现象,也会使得程序的整体性能变差。
  2. YGC耗时过长
    1. 一般来说,YGC的总耗时在几十或者上百毫秒是比较正常的,虽然会引起系统卡顿几毫秒或者几十毫秒,这种情况几乎对用户无感知,对程序的影响可以忽略不计。
    2. 如果YGC耗时达到了1秒甚至几秒(都快赶上FGC的耗时了),那卡顿时间就会增大,加上YGC本身比较频繁,就会导致比较多的服务超时问题。
  3. FGC耗时过长
    1. FGC耗时增加,卡顿时间也会随之增加,尤其对于高并发服务,可能导致FGC期间比较多的超时问题,可用性降低,这种也需要关注。
  4. YGC过于频繁
    1. 即使YGC不会引起服务超时,但是YGC过于频繁也会降低服务的整体性能,对于高并发服务也是需要关注的。

其中,「FGC过于频繁」和「YGC耗时过长」,这两种情况属于比较典型的GC问题,大概率会对程序的服务质量产生影响。剩余两种情况的严重程度低一些,但是对于高并发或者高可用的程序也需要关注。

如何排查

  1. 公司的监控系统:大部分公司都会有,可全方位监控JVM的各项指标。
  2. JDK自带工具:jmap、jstat
    1. 查看堆内存各区域的使用率以及GC情况:jstat -gcutil pid 1000   (重点关注结果中的YGC、YGCT、FGC、FGCT、GCT)

    2. 查看堆内存中的存活对象,并按空间排序:jmap -histo pid | head -n20

    3. dump堆内存文件:jmap -dump:format=b,file=heap pid

  3. 第三方工具:MAT、jprofiler

排查实例

线上FullGC频繁排查-druid_Rocky的博客-CSDN博客
实际项目中查找频繁FullGC的原因,qq_38701303的博客-CSDN博客
一次频繁Full GC的排查过程_沈鸿斌的博客-CSDN博客_fullgc排查步骤

Java问题排查系列--线上问题排查的方法/步骤相关推荐

  1. 【面试篇】Java自带的线上问题排查工具

    [面试篇]Java自带的线上问题排查工具 (1)jps命令 来查看虚拟机进程状态工具 jps是Java提供的一个显示当前所有Java进程的pid的命令,适合查看当前Java进程的一些简单情况.类似于p ...

  2. Java线上问题排查系列--后端接口响应慢的排查方法及解决方案

    原文网址:Java线上问题排查系列--后端接口响应慢的排查方法及解决方案_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java后端接口响应慢的排查的方法以及如何解决. 如何发现接口响应慢了? ...

  3. linux 内存溢出排查_记一次JAVA 线上故障排查完整套路

    JAVA线上故障排查全套路 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jmap等工具也 ...

  4. 【深入理解JVM】JAVA线上故障排查全套路

    线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jmap等工具也是不囿于一个方面的问题的,基 ...

  5. Java线上问题排查思路及Linux常用问题分析命令学习

    前言 之前线上有过一两次OOM的问题,但是每次定位问题都有点手足无措的感觉,刚好利用星期天,以测试环境为模版来学习一下Linux常用的几个排查问题的命令. 也可以帮助自己在以后的工作中快速的排查线上问 ...

  6. Java 线上问题排查思路与工具使用

    本文来自作者 蓬蒿 在 GitChat 上分享 「Java 线上问题排查思路与工具使用」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 一.前言 Java 语言是当前互联网应用最为广泛的语 ...

  7. JAVA线上问题排查及常用命令

    前言 线上问题排查是程序员绕不开路.线上故障主要会包括 CPU.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如 jstack.jm ...

  8. java线程堆栈nid.tid_java排查一个线上死循环cpu暴涨的过程分析

    问题,打一个页面cpu暴涨,打开一次就涨100%,一会系统就卡的不行了. 排查方法,因为是线上的linux,没有用jvm监控工具rim链接上去. 只好用命令排查: top cpu排序,一个java进程 ...

  9. java基础巩固-宇宙第一AiYWM:为了维持生计,做项目经验之~SSM项目错误集锦Part3(项目蹦+pg数据库坏+100%-->线上故障排查经验【业务bug第一步一定是先看日志,写好日志】)~整起

    项目中遇到的一个问题:项目忽然蹦了,用我们的域名登陆不上去了. 根据之前的经验,一般比如我们项目登不上去了或者数据库不上数据了(数据不更新),直接在Xshell上远程reboot一下,再重启一下tom ...

  10. 全面Java程序线上故障排查

    文章内容过长,望读者见谅,小编在文末准备了彩蛋 目录 这篇文章是在公司做了不少的线上Java服务故障排查和优化之后的一个总结,可以作为一个工具清单,在分析问题的时候需要有整体思路:全局观,先从系统层面 ...

最新文章

  1. R2LIVE: 一个鲁棒实时的雷达-惯导-视觉紧耦合的位姿估计和建图系统
  2. 【RocketMQ工作原理】消息堆积与消费延迟
  3. No.6 建立swap分区、进程、安装软件包的方法(rpm,yum,编译)
  4. 阿里mysql同步工具otter的docker镜像
  5. 30秒内便能学会的30个超实用Python代码片段
  6. HDU - 1160 FatMouse's Speed(最长不下降子序列)
  7. dev 报表设计器 怎么设置每页10行_可嵌入您系统的.NET 报表控件ActiveReports:带状列表组件...
  8. C语言自学《三》---- 条件判断
  9. 米粉期盼小米Civi推Pro版本:搭载骁龙870旗舰芯片
  10. hibernate分页中跳转到第几页的功能
  11. windows10资讯和兴趣怎么关闭?
  12. FOR XML PATH 应用及其反向分解
  13. Vue 下载本地静态资源static文件夹
  14. 公共场合的wifi 靠不住
  15. 字符串按照ASCII排序
  16. Python地学分析 — GDAL通过矢量裁剪遥感图像
  17. 帝国cms7.2通过数据库修改用户密码
  18. 读书笔记:无人机控制(二)
  19. 真无线降噪蓝牙耳机推荐,综合性能表现不错的降噪蓝牙耳机分享
  20. 初识数据结构——“数据结构与算法”

热门文章

  1. 第23章 向碧蓝的苍穹致敬——三维天空的构建
  2. amazon创建sns_我们如何在36小时内重新创建Amazon Go
  3. iOS 上的FlexBox布局
  4. 电子邮件客户端java实现_java电子邮件客户端软件
  5. eNews 第二十四期/2007.05
  6. 嘉兴 机器人仓库 菜鸟_菜鸟在嘉兴推出全新智能仓 在“双11”启用超级机器人仓群...
  7. 人脸识别智能门禁D508也能“码”上开门
  8. 刨根问底学Blog(转)
  9. 微信红包封面热潮的背后思考
  10. 堂食扫码点餐的小程序设计开发