通过 jstack 与 jmap 分析一次线上故障
原文出处: kingszelda
一、发现问题
下面是线上机器的cpu使用率,可以看到从4月8日开始,随着时间cpu使用率在逐步增高,最终使用率达到100%导致线上服务不可用,后面重启了机器后恢复。
二、排查思路
简单分析下可能出问题的地方,分为5个方向:
- 系统本身代码问题
- 内部下游系统的问题导致的雪崩效应
- 上游系统调用量突增
- http请求第三方的问题
- 机器本身的问题
三、开始排查
- 查看日志,没有发现集中的错误日志,初步排除代码逻辑处理错误。
- 首先联系了内部下游系统观察了他们的监控,发现一起正常。可以排除下游系统故障对我们的影响。
- 查看provider接口的调用量,对比7天没有突增,排除业务方调用量的问题。
- 查看tcp监控,TCP状态正常,可以排除是http请求第三方超时带来的问题。
- 查看机器监控,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,每个类持有一个,不会多次新建。
七、本文总结
遇到线上问题不要慌,首先确认排查问题的思路:
- 查看日志
- 查看CPU情况
- 查看TCP情况
- 查看java线程,jstack
- 查看java堆,jmap
- 通过MAT分析堆文件,寻找无法被回收的对象
通过 jstack 与 jmap 分析一次线上故障相关推荐
- GC原理介绍、排查FGC及线上故障的步骤
一.GC的原理介绍 JAVA堆分为新生代(Young Generation)和老年代(Old Generation)( 也就是图中对应的New Generation 和 tenured Generat ...
- JAVA 线上故障排查套路,从 CPU、磁盘、内存、网络到GC 一条龙!
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数 ...
- JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:fredal https://fredal.xin/java ...
- JAVA 线上故障排查完整套路!牛掰!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源丨8rr.co/kV3R 线上故障主要会包括 CPU.磁盘.内 ...
- JAVA 线上故障排查指南!
来源:https://fredal.xin/java-error-check 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依 ...
- 从 CPU、磁盘、内存、网络、GC 一条龙!JAVA 线上故障排查完整套路
线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jmap等工具也是不囿于一个方面的问题的,基 ...
- java gc日志乱码_6000+字,30+张图。JAVA线上故障排查全套路总结。
fredalxin|https://sourl.cn/duWZhd 线上故障主要会包括 cpu.磁盘.内存以及 网络 问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次 ...
- 一整套Java线上故障排查技巧,爱了!
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:腾讯推出高性能 RPC 开发框架 个人原创100W+访问量博客:点击前往,查看更多 来源:fredal.xin/ ...
- 线上故障排查全套路盘点,运维大哥请自查!
[欢迎关注微信公众号:厦门微思网络] 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jma ...
- 【干货】救火必备:线上故障排查套路大全
线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍. 同时例如 jstack.jmap 等工具也是不囿于一个方面的问题 ...
最新文章
- R语言包_plotly
- C语言百度翻译API的使用,c语言怎么翻译? 程序怎么运行?
- css——模态框【遮罩层的制作;信息层;往白色的块里添加表单】
- win7+vs2015/13+caffe+matlab+python(CPU only)配置
- ibm db2获取目标时间与当前时间的差值_【学术论文】高帧频视觉实时目标检测系统...
- django学习第一天
- html返回按钮 超链接,ppt超链接返回键
- Spring boot应用【tailf】服务启动停止管理脚本
- cmd命令查询电脑序列号_如何查看台式电脑序列号
- android微信hook过滤检测,Hook实现Android 微信,陌陌 ,探探位置模拟
- The PyTorch-Kaldi Speech Recognition Toolkit
- 服务器一装2008r2系统就蓝屏,服务器安装2008r2后蓝屏
- Scala应用场景以及环境部署
- 关于Data Matrix 基于ECC200标准的编码原理和相关开源代码
- 程序人生 - 为了避免惹上官司,你可以在这些免版权图片网站里寻找素材
- 4款小众实用的手机APP,全是安卓手机的黑科技软件!
- Python实战技巧系列
- 【电源专题】开关稳压器vs线性稳压器
- zoj3380 Patchouli's Spell Cards
- 高考作文做个标题党,有何不好!
热门文章
- lisp如何将度分秒转换为弧度_1/16怎么转换成角度(度分秒)??
- Php-SPL库中的迭代器类详解
- tomcat运行超时问题解决
- P80 例4-1 名和姓的对换问题。英国人和美国人姓名的书写形式是“名在前,姓在后”,但在有些情况下,需要把姓名写成“姓在前,名在后,中间加一个逗号”的形式。编写一个程序实现把“名在前,姓在后”的姓名
- Package winbind is not configured yet.
- 蓝光三维扫描仪用于钢板焊接变形全尺寸测量
- simulink仿真之正弦波变方波
- 马蜂窝ABTest多层分流系统的设计与实现
- tecplot360 2015 R1读abaqus后处理文件
- NLP+VS︱深度学习数据集标注工具、图像语料数据库、实验室搜索ing...