troubleshoot之:使用JFR分析性能问题
简介
java程序的性能问题分析是一个很困难的问题。尤其是对于一个非常复杂的程序来说,分析起来更是头疼。
还好JVM引入了JFR,可以通过JFR来监控和分析JVM的各种事件。通过这些事件的分析,我们可以找出潜在的问题。
今天我们就来介绍一下对java性能分析比较重要的一些JFR事件。
GC性能事件
一般来说,GC会对java程序的性能操作产生比较重要的影响。我们可以使用jfr监控jdk.GCPhasePause事件。
下面是一个jdk.GCPhasePause的例子:
jfr print --events jdk.GCPhasePause flight_recording_1401comflydeanTestMemoryLeak89268.jfr
输出结果:
jdk.GCPhasePause {
startTime = 19:51:49.798
duration = 41.1 ms
gcId = 2
name = "GC Pause"
}
通过GCPhasePause事件,我们可以统计总的GC pause时间和平均每一次GC pause的时间。
一般来说GC是在后台执行的,所以GC本身的执行时间我们并不需要关注,因为这并不会影响到程序的性能。我们需要关注的是应用程序因为GC暂停的时间。
考虑下面两种情况,第一种单独的GC导致GC pause时间过长。第二种是总的GC pause时间过长。
如果是第一种情况,那么可能需要考虑换一个GC类型,因为不同的GC类型在pause时间和吞吐量的平衡直接会有不同的处理。同时我们需要减少finalizers的使用。
如果是第二种情况,我们可以从下面几个方面来解决。
增加heap空间大小。heap空间越大,GC的间隔时间就越长。总的GC pause时间就会越短。
尽量减少tmp对象的分配。我们知道为了提升多线程的性能,JVM会使用TLAB技术。一般来说小对象会分配在TLAB中,但如果是大对象,则会直接分配在heap空间中。但是大部分对象都是在TLAB中分配的。所以我们可以同时关注TLAB和TLAB之外的两个事件:jdk.ObjectAllocationInNewTLAB和dk.ObjectAllocationOutsideTLAB。
减少分配频率。我们可以通过jdk.ThreadAllocationStatistics来分析。
同步性能
在多线程环境中,因为多线程会竞争共享资源,所以对资源的同步,或者锁的使用都会影响程序的性能。
我们可以监控jdk.JavaMonitorWait事件。
jfr print --events jdk.JavaMonitorWait flight_recording_1401comflydeanTestMemoryLeak89268.jfr
我们看一个结果:
jdk.JavaMonitorWait {
startTime = 19:51:25.395
duration = 2 m 0 s
monitorClass = java.util.TaskQueue (classLoader = bootstrap)
notifier = N/A
timeout = 2 m 0 s
timedOut = true
address = 0x7FFBB7007F08
eventThread = "JFR Recording Scheduler" (javaThreadId = 17)
stackTrace = [
java.lang.Object.wait(long)
java.util.TimerThread.mainLoop() line: 553
java.util.TimerThread.run() line: 506
]
}
通过分析JavaMonitorWait事件,我们可以找到竞争最激烈的锁,从而进行更深层次的分析。
IO性能
如果应用程序有很多IO操作,那么IO操作也是会影响性能的关键一环。
我们可以监控两种IO类型:socket IO和File IO。
相对应的事件有:dk.SocketWrite,jdk.SocketRead,jdk.FileWrite,jdk.FileRead。
代码执行的性能
代码是通过CPU来运行的,如果CPU使用过高,也可能会影响到程序的性能。
我们可以通过监听jdk.CPULoad事件来对CPULoad进行分析。
jfr print --events jdk.CPULoad flight_recording_1401comflydeanTestMemoryLeak89268.jfr
看下运行结果:
jdk.CPULoad {
startTime = 19:53:25.519
jvmUser = 0.63%
jvmSystem = 0.37%
machineTotal = 20.54%
}
如果jvm使用的cpu比较少,但是整个machine的CPU使用率比较高,这说明了有其他的程序在占用CPU。
如果JVM自己的CPU使用就很高的话,那么就需要找到这个占用CPU的线程进行进一步分析。
其他有用的event
除了上面提到的event之外,还有一些其他有用的我们可以关注的event。
比如线程相关的:jdk.ThreadStart,jdk.ThreadEnd,jdk.ThreadSleep,jdk.ThreadPark。
如果你使用JMC,那么可以很直观的查看JFR的各种事件。

所以推荐大家使用JMC。
本文作者:flydean程序那些事
本文链接:http://www.flydean.com/jvm-diagnostic-perform-issue/
本文来源:flydean的博客
欢迎关注我的公众号:程序那些事,更多精彩等着您!
troubleshoot之:使用JFR分析性能问题的更多相关文章
- Java性能调优:利用JFR生成性能日志
Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JFR生成 ...
- 在VS 2015中边调试边分析性能
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 对代码进行性能分析,之前往往是一种独立的Profiling过程,现在在VS 2015中可以结 ...
- MySQL中使用SHOW PROFILE命令分析性能的用法整理(配合explain效果更好,可以作为优化周期性检查)
这篇文章主要介绍了MySQL中使用show profile命令分析性能的用法整理,show profiles是数据库性能优化的常用命令,需要的朋友可以参考下 show profile是由Jerem ...
- VS2015--win32project配置的一些想法之在 Visual Studio 2015 中进行调试的同一时候分析性能
出处: https://msdn.microsoft.com/zh-cn/magazine/dn973013(en-us).aspx 很多开发商花了绝大多数时间获取应用程序才干正常发挥作用.更少的时间 ...
- Java性能调优:利用JMC分析性能
Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JMC分析 ...
- 使用VisualVM分析性能
性能分析神器VisualVM VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量 ...
- oracle分析性能问题实例
摘录于SAP有关分析ORACLE数据性能事件的文档. 1.A check for the distribution of relevant Oracle server time revealed: 有 ...
- 【mysql】MySQL知识整理-死锁分析-性能优化等
[[TOC]] 常用操作指令 show databases:显示所有的数据库: use dbName: 使用指定数据库 show tables: 显示所有的数据表: desc tableName: 查 ...
- MySQL中使用SHOW PROFILE命令分析性能的用法整理
show profile是由Jeremy Cole捐献给MySQL社区版本的.默认的是关闭的,但是会话级别可以开启这个功能.开启它可以让MySQL收集在执行语句的时候所使用的资源.为了统计报表,把pr ...
随机推荐
- pom.xml文件中的parent标签
基本概念 maven的核心就算pom.xm,使用maven是为了更好地帮项目管理包依赖.如果要引入一个jar包,需要在pom文件中加上 <dependency> <groupId&g ...
- Azure Traffic Manager(二) 基于权重与基于优先级的路由策略为我们的Web项目提供负载均衡
一,引言 上一片文章我们使用 Azure Traffic Manager 分发用户请求,同时演示了两种路由策略,“Performance”,“Geographic”的两种方式,今天我们继续讲解 Tra ...
- 题解 洛谷 P3825 【[NOI2017]游戏】
从题面中四元组\((i,h_i,j,h_j)\)限制选择车子型号,不难想到这题要用\(2-SAT\)解决. 考虑转化为\(2-SAT\)模型,发现除地图\(x\)外,其他地图都只有两种车子型号可以参加 ...
- springmvc(一)springmvc简介与入门程序
springmvc概括: Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱 ...
- Mybatis(一)Mybatis简介与入门程序
Mybatis简介: MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动.创建connection.创建 ...
- Day01_mongoDB入门
学于黑马和传智播客联合做的教学项目 感谢 黑马官网:http://www.itheima.com 传智播客官网:http://www.itcast.cn 微信搜索"艺术行者",关注 ...
- 基于个人理解的springAOP部分源码分析,内含较多源码,慎入
本文源码较多,讲述一些个人对spring中AOP编程的一个源码分析理解,只代表个人理解,希望能和大家进行交流,有什么错误也渴求指点!!!接下来进入正题 AOP的实现,我认为简单的说就是利用代理模式,对 ...
- Python获取当前时间_获取格式化时间_格式化日期
Python获取当前时间_获取格式化时间: Python获取当前时间: 使用 time.time( ) 获取到距离1970年1月1日的秒数(浮点数),然后传递给 localtime 获取当前时间 #使 ...
- PHP exp() 函数
实例 返回 'e' 的不同次方: <?phpecho(exp(0) . "<br>");echo(exp(1) . "<br>") ...
- PHP zip_entry_compressedsize() 函数
定义和用法 zip_entry_compressedsize() 函数返回 zip 档案项目的压缩文件尺寸.高佣联盟 www.cgewang.com 语法 zip_entry_compressedsi ...