常见问题 1:CPU 利用率高问题

CPU 使用率是衡量系统繁忙程度的重要指标,一般情况下单纯的 CPU 高并没有问题,它代表系统正在不断的处理我们的任务,但是如果 CPU 过高,导致任务处理不过来,这个是非常危险需要关注的。

CPU 使用率的安全值没有一个标准值,取决于你的系统是计算密集型还是 IO 密集型,一般计算密集型应用 CPU 使用率偏高 load 偏低,IO 密集型相反。

问题原因:

1、频繁 FullGC/YongGC

如何排查:

  • 查看 gc 日志;
  • jstat -gcutil pid 查看内存使用和 gc 情况。

2 、代码消耗,如死循环,md5 等内存态操作

如何排查:

(1)arthas (已开源)
thread -n 5 查看 CPU 使用率最高的前 5 个线程进行分析

(2)jstack 查找

  • ps -ef | grep java 找到 Java 进程 id;
  • top -Hp pid 找到使用 CPU 最高的线程;
  • printf ‘0x%x’ tid 将线程 id 转化 16 进制;
  • jstack pid | grep tid 找到线程堆栈;
  • 备注:输入 “1” 可查看每个 CPU 的情况,之前有团队遇到单个 CPU 被中间件绑定导致 CPU 飚高的情况。

常见问题 2:load高问题

load 指单位时间内活跃进程数,包含:

  • 运行态线程:执行Thread.start 进入 runnable 等待 CPU 调度,如果 CPU 很忙会导致 runnable 进程数增加;
  • 不可中断态线程:不可中断态主要包含网络 IO磁盘 IO 以及内核态的锁(如 synchronized)等。

问题原因:

1、 CPU 利用率高,运行态线程数多;

排查方法见常见问题一

2、 iowait,等待 IO

如何排查:

  • vmstat 查看 blocked 进程状况;
  • jstack -l pid | grep BLOCKED 查看阻塞态线程堆栈;

3、等待内核态锁,如 synchronized

如何排查:

  • jstack -l pid | grep BLOCKED 查看阻塞态线程堆栈;
  • profiler dump 线程栈,分析线程持锁情况;
  • 分析是否出现死锁。(参考文章:并发编程中的死锁定位排查)

常见问题 3:持续 FullGC问题

在了解 FullGC 原因之前,简单回顾下 jvm 的内存相关知识:

一、普通对象生命周期:

  • new 的对象放在 Eden 区,当 Eden 区满之后进行一次 MinorGC,并将存活的对象放入 S0;
  • 当下一次 Eden 区满的时候,再次进行 MinorGC,并将Eden中存活的对象S0的对象放入 S1(S0S1 始终有一个是空的);
  • 依次循环前两个步骤,知道S0/S1中对象的年龄满足,移动到old区(老年代)
  • 直到 old 区快满进行 FullGC。(通常老年代的GC都是伴随FullGc进行的)。

二、永久代 与 元数据空间

jdk1.7 之前 Java 类信息、常量池、静态变量存储在 Perm 永久代类的原数据静态变量在类加载的时候放入 Perm 区,类卸载的时候清理;
在 1.8 中,MetaSpace 代替 Perm 区,使用本地内存,常量池和静态变量放入堆区,一定程度上解决了在运行时生成或加载大量类造成的 FullGC,如反射、代理、groovy 等。

三、回收算法

年轻代常用 :复制算法
老年代常用 :标记-清除标记-压缩

四、关键常用参数

CMSInitiatingOccupancyFraction 表示老年代使用率达到多少时进行 FullGC; UseCMSCompactAtFullCollection 表示在进行 FullGC 之后进行老年代内存整理,避免产生内存碎片。

五、持续 FullGC问题原因

1、prommotion failed:从 S 区晋升的对象在老年代也放不下导致 FullGC。以下是导致prommotion failed的原因:

原因1:survivor 区太小,对象过早进入老年代。

如何排查:

  • jstat -gcutil pid 1000 观察内存运行情况;
  • jinfo pid 查看 SurvivorRatio 参数;

原因2:大对象分配,没有足够的内存。

如何排查:

  • 日志查找关键字 “allocating large”;
  • profiler 查看内存概况大对象分布;

原因3:old 区存在大量对象。

如何排查:

  • 实例数量前十的类:jmap -histo pid | sort -n -r -k 2 | head -10 ;
  • 实例容量前十的类:jmap -histo pid | sort -n -r -k 3 | head -10;
  • dump 堆,profiler 分析对象占用情况;
2、concurrent mode failed:在 CMS GC 过程中业务线程将对象放入老年代(并发收集的特点)内存不足。原因如下:

原因1fgc触发比例过大,导致老年代占用过多,并发收集时用户线程持续产生对象导致达到触发 FGC 比例

如何排查:

  • jinfo 查看 CMSInitiatingOccupancyFraction 参数,一般 70~80 即可 ;

原因2:老年代存在内存碎片。

如何排查:

  • jinfo 查看 UseCMSCompactAtFullCollection 参数,配置成在 FullGC 后整理内存。

常见问题 4:线程池满问题

Java 线程池以有界队列的线程池为例,当新任务提交时,如果运行的线程少于 corePoolSize,则创建新线程来处理请求。如果正在运行的线程数等于 corePoolSize 时,则新任务被添加到队列中,直到队列满。当队列满了后,会继续开辟新线程来处理任务,但不超过 maximumPoolSize。当任务队列满了并且已开辟了最大线程数,此时又来了新任务,ThreadPoolExecutor 会拒绝服务。

问题原因:

1、下游 响应时间(RT)高,超时时间不合理导致

如何排查:借助skywalking等三方监控进行监控和调整。

2、数据库慢 sql 或者数据库死锁导致

如何排查:

  • 日志查询关键字 “Deadlock found when trying to get lock” ;
  • Jstack查看阻塞态线程;
3、Java 代码死锁

如何排查:

  • jstack l pid | grep -i E 'BLOCKED | deadlock'
  • dump thread 通过 zprofiler 分析阻塞线程和持锁情况;

常见问题 5:NoSuchMethodException异常

问题原因

jar 包冲突

如何解决:

  • mvn dependency:tree 分析报错方法所在的 jar 包版本,留下新的;
  • arthas:sc -d ClassName
  • XX:+TraceClassLoading

类似问题

  • ClassNotFoundException
  • NoClassDefFoundError
  • ClassCastException

常见问题解决方案

线程池满

rpc框架线程池满:高RT接口进行限流。

CPU 高,load 高

 单机置换或重启,可短暂缓解,然后具体看是`业务激增导致`或者`程序内部`导致。

下游RT 高

  • 限流
  • 降级

数据库死锁

  • kill线程

慢SQL

  • SQL调优;
  • 服务限流;

线上问题的排查是一个积累的过程,只有了解问题背后的原理才能更快速的定位和恢复,除此之外更需要有一些趁手的工具来辅助排查,从而降低整个团队故障恢复的效率。

整理一下:遇到的Java服务故障问题及排查方案相关推荐

  1. 关于 Java 同名类加载顺序问题排查方案

    排查背景 最近在生产上部署 UDF 时,遇到一个两个环境完全相同,但是一个客户端报错另一个正常的情况,经过多次调试问题终于得以解决,现将解决思路记录一下,希望能对后来者有所帮助.(生产环境不便于截图. ...

  2. 用“逐步排除”的方法定位Java服务线上“系统性”故障

    说明:原文地址已经不可访问,其他地方有转载,不过很多丢失图片,所以,找到一处有图的重新配好图. 用"逐步排除"的方法定位Java服务线上"系统性"故障 Post ...

  3. java 故障排查_目前最全的 Java 服务问题排查套路

    问题分类: CPU问题 内存问题(GC问题.内存泄漏. OOM,Coredump 等) I/O问题 问题排查工具箱: 系统级别的工具: top:查看系统/进程cpu.内存.swap等资源占用情况的必备 ...

  4. 聊一聊 Java 服务端中的乱象

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:阿里巴巴中间件 查尔斯·狄更斯在<双城记>中写道 ...

  5. Jvm 系列(六):Java 服务 GC 参数调优案例

    本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响. 这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题. ...

  6. jvm系列(六):Java服务GC参数调优案例

    本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响. 这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题. ...

  7. Java死锁故障排除和解决

    JavaOne年度会议的一大优点是,主题专家介绍了几个技术和故障排除实验室. 其中的一个实验室今年特别吸引了我的注意力:" HOL6500-查找和解决Java死锁 ",由Java冠 ...

  8. Java服务GC参数调优案例

    这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题.我个人特别喜欢这种实战类的内容,经原作者的授权同意,将文章分享于此.原文链接:Java服务GC参数调优案例,下面为 ...

  9. 第八十期:初创公司5大Java服务困局,阿里工程师如何打破?

    初创公司遇到的每一个问题都可能攸关生死.创业之初更应该总结行业的常见问题,对比方案寻找最优解. 作者:常意 初创公司遇到的每一个问题都可能攸关生死.创业之初更应该总结行业的常见问题,对比方案寻找最优解 ...

最新文章

  1. 【温故知新】CSS学习笔记(背景)
  2. 利用 Python 分析了某化妆品企业的销售情况,我得出的结论是?
  3. 克拉克拉(KilaKila):大规模实时计算平台架构实战
  4. pytorch0.4版的CNN对minist分类
  5. linux下python开发环境搭建_linux下python开发环境之二——安装Eclipse+PyDev
  6. android px,dp,sp大小转换工具
  7. ECCV 2020 目标检测与跟踪赛事,清华大学主办 GigaVision 2020 欢迎报名~
  8. php排序算法算法,PHP排序算法之基数排序(Radix Sort)实例详解
  9. chrome开发者工具--使用 Network 面板测量您的网站网络性能。
  10. vue.js开发环境部署
  11. Solidity的三种合约间的调用方式 call、delegatecall 和 callcode
  12. html 倒计时,jQuery倒计时插件
  13. Python 根据出生日期判断星座
  14. 网站的友情链接是什么?
  15. 免费下载QFP器件手工焊接指南
  16. pythonallowpos_利用Python抓取并分析京东商品评论数据
  17. 物联网的那些事----------01无线通信技术介绍
  18. 第2关:Pandas创建透视表和交叉表
  19. 软件实施工程师需要掌握的技能
  20. 撼龙图怎么开鸿蒙炁灵,一人之下藏金图技巧-一人之下撼龙藏金图高概率出绝世炁灵技巧...

热门文章

  1. Mac技巧之找到 Mac OS X 系统更新升级包下载后的存储位置,避免多台苹果电脑重复下载苹果OS X 10.7.4发布,升级包下载
  2. win10一直停留在开机界面
  3. 全球11家银行争相布局量子金融计划
  4. maven(3) parent用dependencyManagement控制版本没有传递给module的问题,dependencies.dependency.versionknown-version
  5. Unity网络(二)-Unity3D中的网络
  6. 计算机毕设Node.js+Vue郑州市智慧农贸市场管理系统(程序+LW+部署)
  7. c语言考试程序设计模板,期末考试C语言程序设计
  8. 数电笔记之第三章门电路之cmos反相器静态特性
  9. Error creating bean with name ‘corsWebFilter‘
  10. 当代GSM手机的硬件系统分析[zz]