原文出处: kingszelda

一、发现问题

下面是线上机器的cpu使用率,可以看到从4月8日开始,随着时间cpu使用率在逐步增高,最终使用率达到100%导致线上服务不可用,后面重启了机器后恢复。

二、排查思路

简单分析下可能出问题的地方,分为5个方向:

  1. 系统本身代码问题
  2. 内部下游系统的问题导致的雪崩效应
  3. 上游系统调用量突增
  4. http请求第三方的问题
  5. 机器本身的问题

三、开始排查

  1. 查看日志,没有发现集中的错误日志,初步排除代码逻辑处理错误。
  2. 首先联系了内部下游系统观察了他们的监控,发现一起正常。可以排除下游系统故障对我们的影响。
  3. 查看provider接口的调用量,对比7天没有突增,排除业务方调用量的问题。
  4. 查看tcp监控,TCP状态正常,可以排除是http请求第三方超时带来的问题。
  5. 查看机器监控,6台机器cpu都在上升,每个机器情况一样。排除机器故障问题。

即通过上述方法没有直接定位到问题。

四、解决方案

1.重启了6台中问题比较严重的5台机器,先恢复业务。保留一台现场,用来分析问题。

2.查看当前的tomcat线程pid

3.查看该pid下线程对应的系统占用情况。top -Hp 384

4.发现pid 4430 4431 4432 4433 线程分别占用了约40%的cpu

5.将这几个pid转为16进制,分别为114e 114f 1150 1151

6.下载当前的java线程栈 sudo -u tomcat jstack -l 384>/1.txt

7.查询5中对应的线程情况,发现都是gc线程导致的

8.dump java堆数据

sudo -u tomcat jmap -dump:live,format=b,file=/dump201612271310.dat 384

9.使用MAT加载堆文件,可以看到javax.crypto.JceSecurity对象占用了95%的内存空间,初步定位到问题。

MAT下载地址:http://www.eclipse.org/mat/

10.查看类的引用树,看到BouncyCastleProvider对象持有过多。即我们代码中对该对象的处理方式是错误的,定位到问题。

五、代码分析

我们代码中有一块是这样写的

这是加解密的功能,每次运行加解密都会new一个BouncyCastleProvider对象,放倒Cipher.getInstance()方法中。

看下Cipher.getInstance()的实现,这是jdk的底层代码实现,追踪到JceSecurity类中

verifyingProviders每次put后都会remove,verificationResults只会put,不会remove.

看到verificationResults是一个static的map,即属于JceSecurity类的。

所以每次运行到加解密都会向这个map put一个对象,而这个map属于类的维度,所以不会被GC回收。这就导致了大量的new的对象不被回收。

六、代码改进

将有问题的对象置为static,每个类持有一个,不会多次新建。

七、本文总结

遇到线上问题不要慌,首先确认排查问题的思路:

  1. 查看日志
  2. 查看CPU情况
  3. 查看TCP情况
  4. 查看java线程,jstack
  5. 查看java堆,jmap
  6. 通过MAT分析堆文件,寻找无法被回收的对象

通过 jstack 与 jmap 分析一次线上故障相关推荐

  1. GC原理介绍、排查FGC及线上故障的步骤

    一.GC的原理介绍 JAVA堆分为新生代(Young Generation)和老年代(Old Generation)( 也就是图中对应的New Generation 和 tenured Generat ...

  2. JAVA 线上故障排查套路,从 CPU、磁盘、内存、网络到GC 一条龙!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数 ...

  3. JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:fredal https://fredal.xin/java ...

  4. JAVA 线上故障排查完整套路!牛掰!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源丨8rr.co/kV3R 线上故障主要会包括 CPU.磁盘.内 ...

  5. JAVA 线上故障排查指南!

    来源:https://fredal.xin/java-error-check 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依 ...

  6. 从 CPU、磁盘、内存、网络、GC 一条龙!JAVA 线上故障排查完整套路

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

  7. java gc日志乱码_6000+字,30+张图。JAVA线上故障排查全套路总结。

     fredalxin|https://sourl.cn/duWZhd 线上故障主要会包括 cpu.磁盘.内存以及 网络 问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次 ...

  8. 一整套Java线上故障排查技巧,爱了!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:腾讯推出高性能 RPC 开发框架 个人原创100W+访问量博客:点击前往,查看更多 来源:fredal.xin/ ...

  9. 线上故障排查全套路盘点,运维大哥请自查!

    [欢迎关注微信公众号:厦门微思网络] 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jma ...

  10. 【干货】救火必备:线上故障排查套路大全

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

最新文章

  1. R语言包_plotly
  2. C语言百度翻译API的使用,c语言怎么翻译? 程序怎么运行?
  3. css——模态框【遮罩层的制作;信息层;往白色的块里添加表单】
  4. win7+vs2015/13+caffe+matlab+python(CPU only)配置
  5. ibm db2获取目标时间与当前时间的差值_【学术论文】高帧频视觉实时目标检测系统...
  6. django学习第一天
  7. html返回按钮 超链接,ppt超链接返回键
  8. Spring boot应用【tailf】服务启动停止管理脚本
  9. cmd命令查询电脑序列号_如何查看台式电脑序列号
  10. android微信hook过滤检测,Hook实现Android 微信,陌陌 ,探探位置模拟
  11. The PyTorch-Kaldi Speech Recognition Toolkit
  12. 服务器一装2008r2系统就蓝屏,服务器安装2008r2后蓝屏
  13. Scala应用场景以及环境部署
  14. 关于Data Matrix 基于ECC200标准的编码原理和相关开源代码
  15. 程序人生 - 为了避免惹上官司,你可以在这些免版权图片网站里寻找素材
  16. 4款小众实用的手机APP,全是安卓手机的黑科技软件!
  17. Python实战技巧系列
  18. 【电源专题】开关稳压器vs线性稳压器
  19. zoj3380 Patchouli's Spell Cards
  20. 高考作文做个标题党,有何不好!

热门文章

  1. lisp如何将度分秒转换为弧度_1/16怎么转换成角度(度分秒)??
  2. Php-SPL库中的迭代器类详解
  3. tomcat运行超时问题解决
  4. P80 例4-1 名和姓的对换问题。英国人和美国人姓名的书写形式是“名在前,姓在后”,但在有些情况下,需要把姓名写成“姓在前,名在后,中间加一个逗号”的形式。编写一个程序实现把“名在前,姓在后”的姓名
  5. Package winbind is not configured yet.
  6. 蓝光三维扫描仪用于钢板焊接变形全尺寸测量
  7. simulink仿真之正弦波变方波
  8. 马蜂窝ABTest多层分流系统的设计与实现
  9. tecplot360 2015 R1读abaqus后处理文件
  10. NLP+VS︱深度学习数据集标注工具、图像语料数据库、实验室搜索ing...