生产环境最多的几种事故之一就是程序执行慢,如果是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程序执行慢诊断手册的更多相关文章

  1. 【深入JVM内核—原理、诊断与优化】第2期开课了

    [深入JVM内核—原理.诊断与优化]的讲师“葛一鸣”,人称“一哥”,毕业于浙江工业大学,计算机软件与理论专业硕士,是国家认证系统分析师,OCP.2012年出版过<Java程序性能优化>,荣 ...

  2. [转]JAVA程序执行顺序,你了解了吗:JAVA中执行顺序,JAVA中赋值顺序

    本文主要介绍以下两块内容的执行顺序,熟悉的大虾可以直接飘过. 一.JAVA中执行顺序 静态块 块 构造器 父类构造器 二.JAVA中赋值顺序 静态块直接赋值 块直接赋值 父类继承的属性已赋值 静态变量 ...

  3. [转载]JAVA内存分析——栈、堆、方法区 程序执行变化过程

    面向对象的内存分析 参考:http://www.sxt.cn/Java_jQuery_in_action/object-oriented.html :尚学堂JAVA300集-064内存分析详解_栈_堆 ...

  4. Java程序执行的过程

    ava程序执行的过程: Step1:将字节码加入内存: Step2:对字节码进行合法性检查: Step3:jvm会为每个字节码文件都生成一个对象(class): Step4:执行静态代码块,初始化静态 ...

  5. JVM学习第三天(JVM的执行子系统)之开篇Class类文件结构

    虽然这几天 很忙,但是学习是不能落下的,也不能推迟,因为如果推迟了一次,那么就会有无数次;加油,come on! Java跨平台的基础: 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节 ...

  6. Java程序执行过程及内存机制

    本讲将介绍Java代码是如何一步步运行起来的,其中涉及的编译器,类加载器,字节码校验器,解释器和JIT编译器在整个过程中是发挥着怎样的作用.此外还会介绍Java程序所占用的内存是被如何管理的:堆.栈和 ...

  7. JVM 的执行子系统

    JVM 的执行子系统. 一.Class类文件结构 1. JVM的平台无关性 与平台无关性是建立在操作系统上,虚拟机厂商提供了许多可以运行在各种不同平台的虚拟机,它们都可以载入和执行字节码,从而实现程序 ...

  8. Linux命令行上程序执行的那一刹那!

    转自:http://www.cppblog.com/cuijixin/archive/2008/03/14/44463.html by falcon<zhangjinw@gmail.com> ...

  9. (转)对《30个提高Web程序执行效率的好经验》的理解

    阅读了博客园发布的IT文章<30个提高Web程序执行效率的好经验>,这30条准则对我们web开发是非常有用的,不过大家可能对其中的一些准则是知其然而不知其所以然. 下面是我对这些准则的理解 ...

随机推荐

  1. springboot与ActiveMQ整合

    前言 很多项目, 都不是一个系统就做完了. 而是好多个系统, 相互协作来完成功能. 那, 系统与系统之间, 不可能完全独立吧? 如: 在学校所用的管理系统中, 有学生系统, 资产系统, 宿舍系统等等. ...

  2. MySQL GTID你知多少

    MySQL在5.6的版本推出了GTID复制,相比传统的复制,GTID复制对于运维更加友好,这个事务是谁产⽣,产⽣多少事务,⾮常直接的标识出来,当然GTID也有限制,对于什么是GTID可以参考我之前的文 ...

  3. win8 notepad++ 设置无法保存

    前些天买了新笔记本.装的是win8 ,后来装了notepad++ ,最新版的,改了字体,下次从新打开之后,发现字体改动无效.后来试了一下“管理员身份运行”,再次打开,保存就有效.但总不能每次都那样去右 ...

  4. tomcat通过一个端口号实现多域名访问

    最近在一个项目中遇到这样的一个场景,在一台服务器一个tomcat一个端口配置多个域名.没想到解决方法这么简单,通过虚拟目录来实现. 修改tomcat安装路径下/conf下的server.xml vim ...

  5. 详细分析MySQL事务日志(redo log和undo log)

    innodb事务日志包括redo log和undo log.redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作. undo log不是redo log的逆向过程,其实它 ...

  6. Python系列:四、Python函数--技术流ken

    Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...

  7. SpringBoot学习(三)-->Spring的Java配置方式之读取外部的资源配置文件并配置数据库连接池

    三.读取外部的资源配置文件并配置数据库连接池 1.读取外部的资源配置文件 通过@PropertySource可以指定读取的配置文件,通过@Value注解获取值,具体用法: @Configuration ...

  8. javascript 小实例,求和的方法sumFn

    新年第一记,从这里开始,先来个简单的!去年的知识梳理留下了很多尾巴,原因有很多(知识储量不足,懒了,项目多...) lg:都是借口~   好吧,我承认,这都是借口,今年一定把尾巴清干净! 下面要写的是 ...

  9. CLR via c# 值类型“不可变”

    昨天看书看到引用类型和值类型,书中讲到值类型“不可变”,如图: 看了两遍没怎么看懂,又仔细多看了几遍,说下我的理解: 比如说一个int类型有几个成员, MaxValue.MinValue的值是不可变的 ...

  10. c# 破解谷歌翻译

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...