分布式系统性能调优利用JMC定位JVM性能问题
头条创作挑战赛头号有新人性能优化javaJava性能调优:利用JMC分析性能
Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻。
好的分析工具能起到事半功倍的效果,利用分析利器JMC、JFR,可以实现性能问题的准确定位。
本文主要阐述如何利用JMC分析系统性能
JMC:JavaMissionControl
JFR:JavaFlightRecorder
JMC:JavaMissionControl
JMC打开性能日志后,主要包括7部分性能报告,分别是一般信息、内存、代码、线程、IO、系统、事件。其中,内存、代码、线程及IO是系统分析的主要部分,本文会重点进行阐述。开启JFR收集:由于JFR是商用的,所以需要解锁Java程序的商业feature:
XX:UnlockCommercialFeaturesXX:FlightRecorderJDK1。8u40之前版本,需在jvm启动前添加参数
JDK1。8u40之后版本,不需要在启动的时候通过flag来解锁了,可以动态的解锁
jcmd17206VM。checkcommercialfeatures
动态解锁后可以运行许JFR采集任务
jcmd17206VM。unlockcommercialfeatures
检查解锁开启JFR收集JFR采集有两种方式:
固定时长的采集
持续不断的采集JFR采集策略默认存储:usrlocaljdk1。8。0161jrelibjfr
default。jfc默认配置开销很低,适用于一直运行,不会影响Java程序的性能。性能开销低于1
profile。jfc采集的事件力度更细(性能开销低于2)JFR采集实操:假定jvmpid是17206
1。采集固定时长JFR任务
查看当前执行的JFR任务
jcmd17206JFR。check
采集5min的JFR任务(采集固定时长JFR任务)
jcmd17206JFR。startnamezhibijfronlinetest1settingsprofiledelay5sduration5mfilenamehomeworkapachetomcat7。0。85zhibijfronlinetest1。jfrcompresstrue
jcmd17206JFR。check
2。持续不断的采集JFR任务
持续采集JFR任务
jcmd17206JFR。startnamezhibijfrtest2settingsprofiledelay5sduration0compresstrue
手动转存jfr文件
jcmd17206JFR。dumpnamezhibijfrtest2filenamehomeworkapachetomcat7。0。85zhibijfrtest2。jfrcompresstrue
停止持续采集JFR任务
jcmd17206JFR。stopnamezhibijfrtest2
定位jvm进程信息
查看当前执行的JFR任务
新建一个采集5min的JFR任务(采集固定时长JFR任务)
查看采集任务状态
生成jfr收集文件后可导入JMC进行可视化问题定位打开效果试试看,主要分为以下部分:标粗部分需重点关注
一般信息:jvm信息系统属性
内存:展示内存占用(堆内堆外)、GC原因、GC时间、对象分配〔可按类、线程展示按对象占用大小排序可直接查看占用较大对象线程堆栈信息快速定位可能存在问题的代码逻辑〕、对象统计信息〔展示增长最快对象〕
代码:类加载类卸载信息
线程:概览〔cpu占用率活跃线程数守护线程数〕、热点线程、争用〔阻塞受阻塞线程〕、等待时间〔按等待时间排序线程〕、线程转储〔类似jstack功能〕、锁定实例〔定位死锁〕
IO:文件IO网络IO
系统:进程环境变量信息
事件:按照事件维度展示系统发生事件展示方式日志、图形、堆栈、直方图
1。一般信息:
一般信息堆内存使用量
一般信息cpu占用率
一般信息jvm信息
一般信息系统属性
一般信息记录信息
2。内存:内存占用(堆内堆外)、GC原因、GC时间、对象分配〔可按类、线程展示按对象占用大小排序可直接查看占用较大对象线程堆栈信息快速定位可能存在问题的代码逻辑〕、对象统计信息〔展示增长最快对象〕
内存概览
垃圾收集(gc原因、回收前后空间、失败原因等)
gc时间(年轻代、老年代、总收集时间、暂停时间等)
GC配置、堆配置、年轻代配置
分配(TLAB分配、TLAB外分配)
TLAB中分配重点关注(可展示对象大小排序展示、TLAB总占用大小比例)
TLAB外分配(大小2k对象TLAB外的Eden区分配空间若此区域占用较大也可关注堆栈反思代码逻辑是否合理)
3。代码:类加载、类卸载信息重点关注
概览展示热点包热点类
热点方法重点关注
调用树默认按照线程堆栈热点排序重点关注
异常错误重点关注展示异常数可查看异常堆栈定位异常堆栈详情方便定位问题代码
编译展示标准编译OSR编译信息重点关注下是否有失败的编译
类加载类卸载统计
4。线程:概览、热点线程、争用、等待时间、线程转储、锁定实例
概览cpu占用率活动线程数、守护线程数
热点线程监控热点线程选中热点线程其堆栈根可以展示出来展开子树可查看其详细堆栈不错
争用若有死锁或锁等待线程在此页面可以展示,定位死锁锁等待代码
等待时间图中展示了线程休眠造成线程上下文切换问题代码堆栈可以做一个fix
线程转储看着有点像jstack的输出
5。IO:文件读取写入、套接字读取写入定位IO瓶颈(文件网络)重点关注
概览文件概览
套接字概览
套接字读入按照线程事件查看跟踪树
6。系统:系统信息、进程信息、环境变量信息
概览
进程
环境变量
7。事件:按照事件维度展示系统发生事件展示方式日志、图形、堆栈、直方图
概览列举系统发生的事件按照类型展示
事件日志定位具体线程事件详情信息
我是架构师kimze,原创不易,喜欢我的文章欢迎关注、点赞、收藏、转发、评论,
我会经常分享互联网微服务架构、云原生架构、行业动态、经典案例、技术趋势,
有问题可关注私信或评论区回复