jvm程序执行慢诊断手册
生产环境最多的几种事故之一就是程序执行慢,如果是web服务的话,表现就是响应时间长。本文分享,从业多年形成的排查守则。
诊断步骤
系统资源查看
首先是系统资源查看,而且必须是在第一步。因为很多事故都是最开始慢后面就会出现卡死,被系统杀死,程序抛出异常结束等等情况,当时的状态没法保存下来,不行进行复盘,所以第一步先查看系统的资源,如果出现紧张情况,赶紧把状态保存。
top命令
查看基本就是top命令,可以看到系统cpu,内存等资源情况。经过查看系统资源大概可以分为以下情况。
问题:cpu使用率过高。
如果发现cpu成为了瓶颈的话,必须马上进行线程情况和当时cpu占用情况的保存。在糟糕的情况下,cpu可能被占满,那时候ssh都登录不上去了,就没法获取当时的情况。
使用top -Hp pid获取线程cpu使用率高的tid
printf "%x\n" tid,获取线程id的16进制主要是为了在jstack中查看
jstack pid|grep tid(16)
然后就会把线程cpu使用率特别高的线程栈打出来,然后可以分析这段逻辑了。
内存使用率过高或者没有系统资源占用过高
jmap -dump:format=b,file=heapdump.bin pid
这里必须打dump的原因是res过高,可能出发系统的oom killer,进程可能被系统杀死,此时不获取,可能进程就会被杀死了。如果不是系统资源问题,堆dump以后也是要用的。
堆占用查看
jstat -gc -h 10 pid 1000
jstat -gcutil -h 10 pid 1000
jstat -gccause -h 10 pid 1000
这里一般是开三个窗口对比看数据的。-gc主要是关注堆的分区总大小。-gcutil主要是关注已使用的百分比。-gccause主要是关注fgc次数,时间以及gc原因。
内存问题的分类就比较多了,造成问题的卡顿的根本其实是gc问题。stw的时候虚拟机停顿了,导致反应不过来了。
问题:堆内存占用空间接近满
这种情况就利用mat去查看dump分析吧,可能出现内存使用不合理或者内存泄漏,这里需要根据代码来分析。
问题:perm,metaspace占用接近满
jps -lvm
查看一下jvm参数设置,很可能是参数设置不合理,-XX:MetaspaceSize是发生gc的最小空间,这里是不是设置太小。MaxMetaspaceSize,MaxPermSize的值是否设置太小。java6如果设置都不小而且还占满了,那就得检测代码里是不是在运行时常量池加了字符串。1.7,1.8就考虑是不是业务用了什么字节码生成技术,动态做了一些字节码操作。
问题:system.gc()
gccause查看gc的原因是system.gc()。需要检测是否用了rmi,使用了直接内存,或者业务代码调用了system.gc()。直接内存查看现在没有现成的工具。可以使用我在github上放着的小工具查看。地址如下https://github.com/xpbob/jstatassist
问题:gc频繁但不是system.gc()
空间都不是特别紧张,但是gc次数频繁,并且不是system.gc()。那可能就是gc参数设置不对了,例如cms,老年代回收是一个2秒一次的轮训操作,很有可能是现在的空间占用每次都是满足gc的条件的,于是出现了这种情况。
问题:gc时间特别长
gc时间特别长,这个就从gc算法选择还有内存情况来协调参数吧。但是有两个特例,cms和g1。这两个垃圾回收器都是有单线程回收的算法的可能的,这里需要gc日志分析确认。
问题:堆占用不大,res特别大
这种情况可能性太大,常见的是jni,jna操作,mmap文件,直接内存使用,jdk的bug。需要根据实际情况来分析。
问题: 业务问题
如果以上表现都没有的话,那需要不断的打jstack去看线程栈的变化。这个只能是结合业务来看。
jvm程序执行慢诊断手册相关推荐
- JVM原理(二)执行引擎篇(JVM程序执行流程、JIT编译器、JIT编译器优化)
一.JVM程序执行流程 上一章我们介绍过程序执行通常分为解释执行和编译执行,而Java两种方式都采用了,下面是Java编译成字节码.动态编译和解释为机器码的过程分析: 编译器和解释器的协调工作流程: ...
- scala语言的底层是java实现的_Scala学习笔记一(与Java、Jvm的关系以及程序执行流程分析)...
一.Scala语言与Java.Jvm的关系分析 Scala语言是马丁奥德斯基接触Java语言后,针对Java语言的特点,将函数式编程语言的特点融合到Java中,由此发明的.Scala语言和Java语言 ...
- 深入 JVM 字节码,解析类加载、链接、初始化、创建对象、对象初始化、程序执行的流程
概述: 本文通过引入一道面试题来解析类加载.类链接.类初始化过程,以及创建创建对象.对象初始化和程序执行的过程. 你将收获: 1.精通类加载.类链接.类初始化过程 2.深入源码层面了解类初始化.对象初 ...
- JVM之(执行引擎、字符串常量池、垃圾回收)-总结
JVM之(执行引擎.性能监控.垃圾回收)-总结 如想了解更多更全面的Java必备内容可以阅读:所有JAVA必备知识点面试题文章目录: JAVA必备知识点面试题 注意: 本篇主要以HotSpot虚拟机为 ...
- 《OpenACC并行程序设计:性能优化实践指南》一 3.5 在应用程序执行期间记录性能信息...
3.5 在应用程序执行期间记录性能信息 应用程序将自动使用第一个插装事件启动Score-P性能监视器.使用几个环境变量来配置性能监视器.为了尽量减小运行时间扰动,Score-P默认设置产生一个基于性能 ...
- DSP2812程序执行过程
DSP2812程序执行过程 开始程序,从main()开始运行 Step1:执行语句InitSysCtrl(); 初始化系统控制模块:包括PLL, WatchDog, enable Peripheral ...
- 小程序执行运行过程原理_PLC的基础小知识!不用把PLC想的太难
PLC实质上是工业计算机,是计算机技术与传统继电接触器控制器技术相结合的产物,只不过比一般的计算机具有更强的与工业过程相连接的接口和更直接的适用于工业控制要求的编程语言. 一.PLC的结构 从硬件结构 ...
- Java实例化后自动执行_Java的实例化顺序(程序执行顺序)
加载/执行顺序: 牢记一点: 静态和非静态分开处理 使用到静态加载时,静态又分为: 静态变量, 静态代码块, 其中加载顺序是按照类中书写的先后顺序加载的 非静态加载顺序: 按照非静态书写顺序加载/执行 ...
- 9.7 LSMW程序导出/导入操作手册-录屏
9.7 LSMW程序导出/导入操作手册-录屏 业务说明:SAP系统分为 DEV配置系统-QAS测试系统-PRD生产系统 在DEV配置系统中通过LSMW将批量导入的程序创建完毕后,但是QAS测试系统和P ...
最新文章
- 链表问题14——在单链表种删除指定值的节点(方法二)
- Hbase完全分布式的搭建
- 【数据结构与算法】之深入解析“零钱兑换II”的求解思路与算法示例
- 如何提高自身监控系统的能力?
- IT技术人员的35个特点,你占几个?
- webpack 前端构建
- latex 公式编号_放弃mathtype,word也可以轻松输入公式
- 怎样让百度快速收录的新方法
- android学习摘要(二)
- Stream Processing With Flink (7) 状态算子和用户函数
- iOS开发工程师求贤贴
- (白光LED显色性)计算白光LED的显色指数(CRI)数据异常,色质指数CQS来替代
- java qua_Qua Vadis Eclipse? 第二部分
- python contains用法_jQuery contains过滤器实现精确匹配使用方法
- 妈妈说就算你注册的域名再长GOOGLE都能搜索出来,百度也有妈妈!
- pc调试微信h5页面提示Pending authentication:please accept debugging session on the device的解决方法
- 软件版本号:命名、说明、规范
- 笑能降血压,笑还能释放压力,减轻沮丧感;笑可以刺激人体分泌多巴胺,使人产生欣快感
- mtk android关机铃声,mtk android power key 长按8s 关机功能实现
- 百度以5000万“祭杀”的王劲是谁?他错了吗?
热门文章
- VDI ROI不包括硬成本节约
- Android UI-实现底部切换标签(fragment)
- 整理LVS架构压力测试工作
- 鼠标放到图片上替换图片,改变样式。
- 联网智能设备安全态势季度报告(2021年第2季度)
- 战“疫”日记②|火神山小分队:像听到发令枪一样;徐碧江带勇士集结长沙“小汤山”...
- 使用FileReader对象的readAsDataURL方法来读取图像文件
- 由来源地址决定显示什么页面
- 分享ISTQB培训体验
- Python代码分析工具:PyChecker、Pylint