整理一下:遇到的Java服务故障问题及排查方案
常见问题 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
(S0
和S1
始终有一个是空的); - 依次循环前两个步骤,知道
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 过程中业务线程将对象放入老年代(并发收集的特点)内存不足。原因如下:
原因1:fgc触发比例
过大,导致老年代占用过多
,并发收集时用户线程持续产生对象
导致达到触发 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服务故障问题及排查方案相关推荐
- 关于 Java 同名类加载顺序问题排查方案
排查背景 最近在生产上部署 UDF 时,遇到一个两个环境完全相同,但是一个客户端报错另一个正常的情况,经过多次调试问题终于得以解决,现将解决思路记录一下,希望能对后来者有所帮助.(生产环境不便于截图. ...
- 用“逐步排除”的方法定位Java服务线上“系统性”故障
说明:原文地址已经不可访问,其他地方有转载,不过很多丢失图片,所以,找到一处有图的重新配好图. 用"逐步排除"的方法定位Java服务线上"系统性"故障 Post ...
- java 故障排查_目前最全的 Java 服务问题排查套路
问题分类: CPU问题 内存问题(GC问题.内存泄漏. OOM,Coredump 等) I/O问题 问题排查工具箱: 系统级别的工具: top:查看系统/进程cpu.内存.swap等资源占用情况的必备 ...
- 聊一聊 Java 服务端中的乱象
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:阿里巴巴中间件 查尔斯·狄更斯在<双城记>中写道 ...
- Jvm 系列(六):Java 服务 GC 参数调优案例
本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响. 这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题. ...
- jvm系列(六):Java服务GC参数调优案例
本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响. 这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题. ...
- Java死锁故障排除和解决
JavaOne年度会议的一大优点是,主题专家介绍了几个技术和故障排除实验室. 其中的一个实验室今年特别吸引了我的注意力:" HOL6500-查找和解决Java死锁 ",由Java冠 ...
- Java服务GC参数调优案例
这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题.我个人特别喜欢这种实战类的内容,经原作者的授权同意,将文章分享于此.原文链接:Java服务GC参数调优案例,下面为 ...
- 第八十期:初创公司5大Java服务困局,阿里工程师如何打破?
初创公司遇到的每一个问题都可能攸关生死.创业之初更应该总结行业的常见问题,对比方案寻找最优解. 作者:常意 初创公司遇到的每一个问题都可能攸关生死.创业之初更应该总结行业的常见问题,对比方案寻找最优解 ...
最新文章
- 【温故知新】CSS学习笔记(背景)
- 利用 Python 分析了某化妆品企业的销售情况,我得出的结论是?
- 克拉克拉(KilaKila):大规模实时计算平台架构实战
- pytorch0.4版的CNN对minist分类
- linux下python开发环境搭建_linux下python开发环境之二——安装Eclipse+PyDev
- android px,dp,sp大小转换工具
- ECCV 2020 目标检测与跟踪赛事,清华大学主办 GigaVision 2020 欢迎报名~
- php排序算法算法,PHP排序算法之基数排序(Radix Sort)实例详解
- chrome开发者工具--使用 Network 面板测量您的网站网络性能。
- vue.js开发环境部署
- Solidity的三种合约间的调用方式 call、delegatecall 和 callcode
- html 倒计时,jQuery倒计时插件
- Python 根据出生日期判断星座
- 网站的友情链接是什么?
- 免费下载QFP器件手工焊接指南
- pythonallowpos_利用Python抓取并分析京东商品评论数据
- 物联网的那些事----------01无线通信技术介绍
- 第2关:Pandas创建透视表和交叉表
- 软件实施工程师需要掌握的技能
- 撼龙图怎么开鸿蒙炁灵,一人之下藏金图技巧-一人之下撼龙藏金图高概率出绝世炁灵技巧...
热门文章
- Mac技巧之找到 Mac OS X 系统更新升级包下载后的存储位置,避免多台苹果电脑重复下载苹果OS X 10.7.4发布,升级包下载
- win10一直停留在开机界面
- 全球11家银行争相布局量子金融计划
- maven(3) parent用dependencyManagement控制版本没有传递给module的问题,dependencies.dependency.versionknown-version
- Unity网络(二)-Unity3D中的网络
- 计算机毕设Node.js+Vue郑州市智慧农贸市场管理系统(程序+LW+部署)
- c语言考试程序设计模板,期末考试C语言程序设计
- 数电笔记之第三章门电路之cmos反相器静态特性
- Error creating bean with name ‘corsWebFilter‘
- 当代GSM手机的硬件系统分析[zz]