系统上线后,系统可能会出现一些迟钝、卡死现象,这个时候就需要我们对系统进行性能方面的优化。本文将大概介绍一下,性能问题的解决思路,以及一次应用系统操作缓慢的分析实操。

一、定位问题方向

首先,查看服务器CPU使用率,磁盘IO以及内存使用情况

1.占用内存几乎等于JVM参数中分配的内存大小,而且长时间处于这种状态的话,应该是程序中可能存在内存泄漏的问题,或者JVM参数设置不合适,从这方面入手。这方面要用到堆DUMP来分析。本文不展开介绍。

2.CPU使用率高或者磁盘IO一直很高的话,可能是有部分代码有问题,需要到线程DUMP文件中进行分析

3.如果这三样看起来都没有什么异常,需要去线程DUMP文件中进行查看,可能是线程死锁,线程阻塞,数据库查询执行缓慢等等问题

(偶尔慢的话,有可能恰好JVM在进行FULL GC,如果FULL GC很频繁,就需要在堆DUMP中进行分析,分析没什么问题后,要对JVM参数进行合理的设置,GC的搭配【1.8以后使用G1】。另外,FULL GC若是时间长,也有可能是分配的堆大小太大导致的)

二、制作线程DUMP

先找到系统进程PID
例如:我的java进程名字叫test,进程PID2316

1.使用jps查看Java进程ID(PID);
Linux下还可以使用ps命令。
jps -l | grep test
ps -ef | grep test

2.使用jstack制作线程Dump。jstack <进程ID> >> <输出文件>
jstack 2316 >> c:\thread.txt
(制作的时候,从点击页面操作开始到结束,执行该命令多次,不需要修改文件名,它是以追加的方式来写入文件,不会覆盖。这样有利于排除其他因素干扰,查看DUMP就可以对比着看)

三、分析线程DUMP工具
工欲善其事必先利其器
分析线程DUMP的工具有很多,我使用了一下三款:
1.TDA

2.IBM Thread and Monitor Dump Analyzer

3.YourKit

先做一个粗略的对比
1.TDA
这是一个基础款,使用起来,Emmmm……原汁原味(一点都不方便)

2.IBM TDA
它把多次的线程DUMP排成了一个时序图,可以很方便的查看不同时段的线程DUMP,可以看到堆栈随时间而产生的变化。缺点:无法看到一个方法的执行时间,不能明确定位到具体的造成系统慢、卡顿的原因,只能靠猜。

3.YourKit
这个工具是收费的,还挺贵,他的仪表盘能够直观的看到CPU,磁盘,内存,死锁等等情况,也可以看到线程、方法、SQL执行时间,有很多个维度来查看,只需要按时间排序后,展开一个个方法就能定位到问题点,很方便。缺点:收费,贵。

关于这些工具的使用方法,网上应该挺多,在此不做赘述(后续看会不会写这些吧)。

四、分析线程DUMP的思路
1.线程DUMP内容

2.线程DUMP使用场景
系统无响应或响应慢,不知道系统状态时。
多线程并发相关的问题,如:死锁、阻塞等

3.线程DUMP的分析模式

分析的原则:
结合代码阅读的推理。需要线程Dump和源码的相互推导和印证。
造成Bug的根源往往不会在调用栈上直接体现,一定格外注意线程当前调用之前的所有调用。

可疑线程,三大入手点:

<1>进入区阻塞;
线程状态BLOCKED,线程动作wait on monitor entry,调用修饰waiting to lock总是一起出现。
表示在代码级别已经存在冲突的调用。必然有问题的代码,需要尽可能减少其发生。

<2>持续运行的IO;
IO操作是可以以RUNNABLE状态达成阻塞。例如:数据库死锁、网络读写。
格外注意对IO线程的真实状态的分析。
一般来说,被捕捉到RUNNABLE的IO调用,都是有问题的。

<3>非线程调度的休眠。

总结:

死锁问题分析的“三板斧”

<1>在最可能死锁的时间点上制作Dump。
<2>找出引起大量线程阻塞的线程。线程X锁住了对象A,大量其他线程在对象A上阻塞。
<3>分析导致该线程阻塞的原因。导致线程X阻塞的原因,数据库事务?内存事务?其他状态?
<4>阅读代码,遍历其它等待或阻塞的线程的调用线索。其他线程在当前调用前,已经完成的所有的调用,是否可能造成线程X的阻塞?

GC的干扰、Dump的比较
虚拟机执行Full GC时,会阻塞所有的用户线程。因此,即时获取到同步锁的线程也有可能被阻塞。这时可以制作多份线程Dump,使用工具的比较功能,分析系统的连续状态。

五、一次分析系统缓慢的实例

将DUMP文件导入IBM TDA 后,选定所有行,compare threads。可以看到下方窗口有线程的整体信息,各个线程状态的信息有多少

打开后的页面,左边是线程名称,中间是多份线程DUMP,类似一个时序图,右边是调用栈

选定用户线程,点击各个时间的DUMP文件,查看堆栈,进行分析
右边有一个dispatch方法,这是一个同步调用方法,在代码中查看,给一个系统发消息,同步调用,时间都耗在了等待返回上(12S)。貌似是一个废弃接口,而且这个业务没必要同步,把这里改成异步就好了。

性能分析深似海,只能一步一步来!

【JAVA】java性能分析之线程DUMP分析相关推荐

  1. 【jvm】jvm jstack使用 Java线程Dump分析

    1.概述 下面这个文章很好:调试排错 - Java线程Dump分析 常用jvm命令1 常用jvm命令1 常用jvm命令1

  2. Java线程dump分析及工具

    Java线程dump分析,可适用IBM的工具:IBM Thread and Monitor Dump Analyzer for Java 使用方法:java -jar jca*.jar.可加必要的VM ...

  3. 【JVM性能调优】jstack和线程dump分析

    一.几个概念: 1.jstack命令的语法格式:jstack <pid>,可用于查看java进程id. 2.Dump文件:Dump文件是进程的内存镜像.可以把程序的执行状态通过调试器保存到 ...

  4. 【JVM】常见调试排错场景、内存与线程Dump分析

    目录 OOM分析 Java堆内存溢出 元空间/方法区溢出 线程Dump OOM分析 Java堆内存溢出 启动参数: -Xms250m -Xmx250m ,最大最小堆内存250m,禁止自动扩展内存 -X ...

  5. Java线程Dump分析

    Thread Dump介绍 什么是Thread Dump Thread Dump是非常有用的诊断Java应用问题的工具.每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能 ...

  6. jstack和线程dump分析

    一:jstack jstack命令的语法格式: jstack  <pid>.可以用jps查看java进程id.这里要注意的是:       1. 不同的 JAVA虚机的线程 DUMP的创建 ...

  7. Java命令:jstack — 获取线程dump信息

    目录 一.命令介绍 二.使用实例 实例一:jstack查看输出 实例二:jstack统计线程数 实例三:jstack检测死锁 实例四:jstack检测CPU高 一.命令介绍 Usage:jstack ...

  8. java dump 工具_Java线程Dump分析工具--jstack

    jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使 ...

  9. java线程dump_Java线程Dump分析 - PerfMa

    概览 分析概况主要统计了各个线程状态的线程数量.比例和后台守护线程的数量.比例. Top5数据,主要展示了线程,线程池,线程栈,方法,锁,5个维度的Top5的数据.点击查看全部,即可跳转到相应具体模块 ...

最新文章

  1. C#WinForm的线程及Invoke应用(转)
  2. RHEL6入门系列之九,常用命令2
  3. 重上热搜!北师大教授:给非洲留学生1年10万奖学金真的不算多!
  4. 基于SpringBoot的考研管理系统
  5. boost::gil模块数字扩展中的 convolve_rows() 和 convolve_cols() 示例
  6. SAP Commerce的Content Page,Content Slot和Component在Spartacus里的应用
  7. android switch自定义样式,Android自定义Switch样式
  8. Spring Boot+JPA 有查询条件的查询
  9. asp.net 返回表单json数据 辅助类
  10. applicationhostconfig
  11. Norton Internet Security 序列号提取(卡饭)
  12. Spring boot 整合Druid框架不支持瀚高,报dbtype not support
  13. python识别中文验证码_Python实现验证码识别
  14. ❤️Python制作表白小程序,七夕能不能脱单就全靠它了!❤️(附源码)
  15. 量子计算机每次秒可达多少次,激光脉冲让运算速度提升百万倍 量子计算机有望实现室温运行...
  16. 服务网关(Gateway)自定义全局过滤器统一Token处理
  17. java finalize方法总结、GC执行finalize的过程
  18. 第二章 一种操作系统的诞生
  19. 解决sql update 1292 - Truncated incorrect DOUBLE value:
  20. anyRTC RTSP转WebRTC方案

热门文章

  1. android+双屏触摸,双屏异触 --- 实现指定触摸为副屏触摸功能
  2. .net framework 转为 .net core
  3. 鸢尾花完整的python代码_鸢尾花BP算法实现 Python
  4. 中国女式运动和户外短裤行业市场供需与战略研究报告
  5. 电脑识别不到硬盘的问题
  6. Linux RHEL7如何开机自动连接网络
  7. 滴滴新锐计划实习生面试经历
  8. 住宅小区网络化物业管理系统——住户管理子系统的实现
  9. 二阶常系数非齐次微分方程求解
  10. springBoot 怎么利用maven 创建可以执行的jar文件?