失效链接处理 |
Java线上故障排查方案 PDF 下载
本站整理下载:
相关截图:
![]()
主要内容:
⼀、前⾔
在软件开发过程中,排查和修复产线问题是每⼀位⼯程师都需要掌握的基本技能。但是在⽣产环境中,
程序代码、硬件、⽹络、协作软件等任⼀因素,都会引发意想不到的问题,所以排查产线问题⽐较困
难,所以问题的定位体现了⼀名⼯程师的基础能⼒,问题的解决则体现了⼯程师的技能素养。
以下从5个⽅⾯分享产线常⻅问题的排查⼿段。
1. Java常⻅线上问题总结
2. 如何定位问题
3. APM链路跟踪分析
4. 常⽤Linux分析命令
5. Arthas(阿尔萨斯)诊断命令
6. JVM问题定位命令
7. GC分析
⼆、Java常⻅线上问题总结
绝⼤多数Java线上问题从表象来看通常可以归纳为4个⽅⾯:CPU、内存、磁盘、⽹络。⽐如,应⽤上线
后突然CPU使⽤率99%、内存泄漏、STW时间过⻓,这些问题通常可以分为两⼤类:
系统异常 (CPU占⽤率过⾼、磁盘使⽤率100%、系统可⽤内存低等)
业务异常 (服务运⾏⼀段时间⾃动退出、服务间调⽤时间过⻓、多线程并发异常、死锁等)
三、如何定位问题
解决问题的第⼀步是定位问题,因为只有定位到了问题产⽣的原因,才能准确的抉择出解决⽅案,排查
⼿段⼀般包括以下⼏项,也可以将此理解为排查顺序:
1. 业务⽇志分析排查
2. APM分析排查
3. 外部环境排查
4. 应⽤服务排查
5. 云⼚商或运营商问题排查
3.1、业务⽇志分析排查
通常情况下,⼤部分错误信息都会在⽇志上有所体现,⽐如看看下⾯这段代码:
这段代码使⽤了 并发流 将数据加⼊到⼀个List中,再运⾏过程中,抛出了
ArrayIndexOutOfBoundsException ,具体异常栈信息如下:
通过⽇志可以看到出错的位置在 TaskServiceImpl.java ⽂件的第75⾏代码上,错误信息
是 java.lang.ArrayIndexOutOfBoundsException:163 ,这就是问题定位,整体描述出来就是: 在
TaskServiceImpl.java⽂件中第75⾏代码上出现了数组越界异常,引起异常的原因是在调⽤
java.util.ArrayList#add()⽅法时因为并发请求导致没有动态扩展数组容量 。
为什么我们能够直接描述出来是在调⽤ ArrayList#add() ⽅法时因为并发请求导致的没有动态扩展数
组容量呢?因为我们结合ArrayList的内部实现原理及动态扩容的特性,可以知道在单线程的情况下,代
码是串⾏执⾏,ArrayList内的数组都会是先扩容再插⼊,所以不会出现数组越界的错误,既然单线程不
会引起该错误,那⼀定就是多线程并发造成的了,解决⽅案就是给代码加锁或者由并发改串⾏,就是这
么简单,这就是技能素养的体现。
通过上⾯的分析,教育了我们:⼀定要在关键代码逻辑位置输出相关⽇志,尤其是在代码发⽣异常的时
候,定要将⽇志输出到⽂件中,只有这样,才更利于我们的排查。
|