troubleshoot之:使用JFR分析性能问题
目录
简介java程序的性能问题分析是一个很困难的问题。尤其是对于一个非常复杂的程序来说,分析起来更是头疼。 还好JVM引入了JFR,可以通过JFR来监控和分析JVM的各种事件。通过这些事件的分析,我们可以找出潜在的问题。 今天我们就来介绍一下对java性能分析比较重要的一些JFR事件。 GC性能事件一般来说,GC会对java程序的性能操作产生比较重要的影响。我们可以使用jfr监控jdk.GCPhasePause事件。 下面是一个jdk.GCPhasePause的例子:
输出结果:
通过GCPhasePause事件,我们可以统计总的GC pause时间和平均每一次GC pause的时间。 一般来说GC是在后台执行的,所以GC本身的执行时间我们并不需要关注,因为这并不会影响到程序的性能。我们需要关注的是应用程序因为GC暂停的时间。 考虑下面两种情况,第一种单独的GC导致GC pause时间过长。第二种是总的GC pause时间过长。 如果是第一种情况,那么可能需要考虑换一个GC类型,因为不同的GC类型在pause时间和吞吐量的平衡直接会有不同的处理。同时我们需要减少finalizers的使用。 如果是第二种情况,我们可以从下面几个方面来解决。
同步性能在多线程环境中,因为多线程会竞争共享资源,所以对资源的同步,或者锁的使用都会影响程序的性能。 我们可以监控jdk.JavaMonitorWait事件。
我们看一个结果:
通过分析JavaMonitorWait事件,我们可以找到竞争最激烈的锁,从而进行更深层次的分析。 IO性能如果应用程序有很多IO操作,那么IO操作也是会影响性能的关键一环。 我们可以监控两种IO类型:socket IO和File IO。 相对应的事件有:dk.SocketWrite,jdk.SocketRead,jdk.FileWrite,jdk.FileRead。 代码执行的性能代码是通过cpu来运行的,如果cpu使用过高,也可能会影响到程序的性能。 我们可以通过监听jdk.cpuLoad事件来对cpuLoad进行分析。
看下运行结果:
如果jvm使用的cpu比较少,但是整个machine的cpu使用率比较高,这说明了有其他的程序在占用cpu。 如果JVM自己的cpu使用就很高的话,那么就需要找到这个占用cpu的线程进行进一步分析。 其他有用的event除了上面提到的event之外,还有一些其他有用的我们可以关注的event。 比如线程相关的:jdk.ThreadStart,jdk.ThreadEnd,jdk.ThreadSleep,jdk.ThreadPark。 如果你使用JMC,那么可以很直观的查看JFR的各种事件。 所以推荐大家使用JMC。
(编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |