troubleshoot之:使用JFR分析性能问题
liuian 2025-04-27 14:44 43 浏览
简介
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的博客
欢迎关注我的公众号:程序那些事,更多精彩等着您!
相关推荐
- 电脑系统怎么下载到u盘中(电脑系统win7纯净版下载官方免费版最新版)
-
下载电脑系统,可以到电脑系统资源下载网站,找到下载页面的下载点,右击下载点,选择迅雷下载,可以把系统文件下载到硬盘里,然后插上U盘,将下载好的系统文件复制到U盘。另一种方法是,将迅雷软件的默认下载路径...
- 小米主题安装器(红米主题商店app下载安装)
-
很抱歉,一加九手机无法直接安装小米主题。因为一加九和小米手机使用的是不同的操作系统和主题引擎,它们之间不兼容。一加九使用的是基于Android的OxygenOS操作系统,而小米手机使用的是基于Andr...
- hp电脑恢复出厂系统(hp电脑恢复出厂系统操作)
-
在开始菜单的【设置】中找到【重置此电脑】的选项即可开始重置恢复到出厂设置;如果您需要整个硬盘格式化,可以选择其中的【删除所有文件】的选项,等待系统设置完成之后会重新进入新系统设置。以下是详细介绍:...
- ghost做c盘镜像的步骤(ghost制作镜像步骤)
-
共9个步骤:1、一般GHOST工具是在PE启动后使用,这个就是PE中GHOST所在路径,找到这个软件并运行。2、界面是英文版本的,因为软件的易操作易学习性,所以这个软件基本没有中文版版本,然后在弹出的...
- win10家庭版怎么激活系统(win10家庭版激活步骤)
-
win10家庭中文版怎么激活1.在win10系统桌面上,点击左下角的开始按钮选择设置选项进入。2.进入设置列表菜单,点击更新和安全选项进入。3.点击激活选项继续下一步操作。4.在弹出输入产品密钥的对话...
- office2010和2016区别(office2010和2016差别大不大)
-
一、指代不同1、word2010:Word2010是Microsoft公司开发的Office2010办公组件之一,主要用于文字处理工作。2、word2016::Word2016是Microsoft公司...
- win10官网下载教程(windows官网下载win10)
-
步骤1首先打开360安全浏览器步骤2在搜索框中输入“微软官网”,点击“搜索”按钮步骤3点击进入微软官网步骤4下滑界面,在下方可以看到可以下载的系统,此处以windows10企业版下载为例,点击这个版本...
- 恢复帝app下载(恢复帝app官方)
-
微信删除好友一般是不能恢复的,有时候在网上会看到一些关于微信删除好友可以帮助恢复的黑客,大多数都是骗人的,因此,再着急恢复好友也需要理智、谨防上当受骗。1.电源:首先确认摄像头通电是否正常状态,指示灯...
- 系统之家下载安装(系统之家安装版)
-
是靠谱的。系统之家(HomeSystem)广义上包含了电脑系统安装和手机系统安装,在之前手机软件还不是很普及的时候一般特指电脑系统安装,可如今手机用户大量的出现,安卓系统可以说超过Windows系统...
- win10正版系统官网原版纯净版老电脑
-
一,纯净版Win10系统是根据正版系统制作的,没有夹杂其它软件和驱动,和正版系统一样安装完后需要打各种驱动和根据安装常用软件。二,本质上纯净版Win10也是盗版系统,这是和正版系统最大的区别,而且可能...
- 十大最好用的浏览器(市面上最好用的浏览器)
-
1、谷歌chrone 谷歌美国Google公司开发的一款浏览器,谷歌浏览器的特点就是界面简洁,速度快不卡顿,内容全面,你想要找到内容上面都有,就是在安装插件的方面会比较麻烦,不过看在它那么好用的份...
- ipad充不上电了怎么办(ipad充不上电怎么办但显示在充电)
-
原因和解决办法: 1、ipad充不进去电很可能是充电线的原因,假如大家在给ipad充电的时候以前经常有过接触不良的情况,那么,你就需要考虑更换充电线了。 2、第二,就是接口问题了,或者说是充电...
- 怎样取消开机启动项目(如何取消开机启动程序)
-
在Windows操作系统中,有一些程序或服务可能会在计算机启动时自动运行,这些程序或服务也被称为开机启动项。如果您希望在启动Windows时减少计算机运行的程序或服务数量,您可以关闭一些开机启...
- 纯净版win7完整版ghost下载(纯净版的win7)
-
1、去微软官方网站下载。2、去系统之家下载,我自己的win10就是从哪里下载安装的,你可以试试哈。ghost镜像的使用一、备份主分区--C盘:假设你的操作系统安装在主分区--C盘,当系统重装不久,或...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
