前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分布式系统性能调优: 一篇彻底搞定JMC定位JVM性能问题

分布式系统性能调优: 一篇彻底搞定JMC定位JVM性能问题

原创
作者头像
极简架构
修改2023-01-03 20:36:41
1.2K0
修改2023-01-03 20:36:41
举报
文章被收录于专栏:kimzekimze

Java性能调优:利用JMC分析性能

Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻。

好的分析工具能起到事半功倍的效果,利用分析利器JMC、JFR,可以实现性能问题的准确定位。

Java线上进程很多面临大堆内存,无法dump堆内存快照,如何解决这样的问题,就可以通过JMC结合JFR连接到线上进程做一段时间采集,分析java进程性能问题


本文主要阐述如何利用JMC分析系统性能

JMC:Java Mission Control

JFR:Java Flight Recorder

JMC:Java Mission Control

JMC打开性能日志后,主要包括7部分性能报告,分别是一般信息、内存、代码、线程、I/O、系统、事件。其中,内存、代码、线程及I/O是系统分析的主要部分,本文会重点进行阐述。

 开启 JFR 收集:  由于JFR是商用的,所以需要解锁Java程序的商业feature: -XX:+UnlockCommercialFeatures -XX:+FlightRecorder   --JDK 1.8u40之前版本,需再jvm启动前添加参数JDK 1.8u40之后版本,不需要在启动的时候通过flag来解锁了,可以动态的解锁jcmd 17206 VM.check_commercial_features动态解锁 后可以运行许JFR采集任务jcmd 17206 VM.unlock_commercial_features

检查 & 解锁 开启JFR 收集

JFR采集有两种方式:  固定时长的采集   持续不断的采集JFR采集策略 默认存储: /usr/local/jdk1.8.0_161/jre/lib/jfrdefault.jfc 默认配置-开销很低,适用于一直运行,不会影响Java程序的性能。性能开销低于1% profile.jfc 采集的事件力度更细(性能开销低于2%)JFR 采集实操:  假定 jvm pid是 17206 1.采集固定时长JFR任务--查看当前执行的 JFR 任务 jcmd 17206 JFR.check  -- 采集 5min的 JFR任务(采集固定时长JFR任务) jcmd 17206 JFR.start name=zhibi_jfr_online_test1 settings=profile delay=5s duration=5m filename="/home/work/apache-tomcat-7.0.85/zhibi_jfr_online_test1.jfr" compress=true    jcmd 17206 JFR.check2.持续不断的采集JFR任务持续采集 JFR 任务 jcmd 17206 JFR.start name=zhibi_jfr_test2 settings=profile delay=5s duration=0 compress=true -手动转存 jfr 文件 jcmd 17206 JFR.dump name=zhibi_jfr_test2 filename="/home/work/apache-tomcat-7.0.85/zhibi_jfr_test2.jfr" compress=true -停止持续采集 JFR 任务 jcmd 17206 JFR.stop name=zhibi_jfr_test2     

定位jvm进程信息

定位jvm进程信息
定位jvm进程信息

查看当前执行的 JFR 任务

查看当前执行的 JFR 任务
查看当前执行的 JFR 任务

新建一个采集 5min的 JFR任务(采集固定时长JFR任务)

查看采集任务状态
查看采集任务状态

查看采集任务状态

# 生成jfr收集文件后可导入JMC进行可视化问题定位

打开效果试试看,主要分为以下部分:  标粗部分需重点关注 一般信息:  jvm信息 & 系统属性 内存:   展示 内存占用(堆内+堆外)、GC原因、GC时间、对象分配可按类、线程展示 按对象占用大小排序 & 可直接查看占用较大对象线程堆栈信息-快速定位可能存在问题的代码逻辑、对象统计信息展示增长最快对象 代码: 类加载 / 类卸载 信息 线程: 概览cpu占用率 & 活跃线程数 & 守护线程数 、热点线程、争用阻塞 & 受阻塞线程、等待时间按等待时间排序线程、线程转储类似jstack功能、锁定实例定位死锁 I/O:  文件IO+网络IO 系统:  进程 & 环境变量信息 事件:  按照事件维度展示 系统 发生 事件-展示方式 日志、图形、堆栈、直方图

1.一般信息: 

一般信息-堆内存使用量
一般信息-堆内存使用量
一般信息-cpu占用率
一般信息-cpu占用率
一般信息-jvm信息
一般信息-jvm信息
一般信息-系统属性
一般信息-系统属性
一般信息-记录信息
一般信息-记录信息

2.内存: 内存占用(堆内+堆外)、GC原因、GC时间、对象分配可按类、线程展示 按对象占用大小排序 & 可直接查看占用较大对象线程堆栈信息-快速定位可能存在问题的代码逻辑、对象统计信息展示增长最快对象

内存概览
内存概览
垃圾收集(包含信息: gc原因、回收前后空间、失败原因等)
垃圾收集(包含信息: gc原因、回收前后空间、失败原因等)
gc时间(年轻代、老年代、总收集时间、暂停时间等)
gc时间(年轻代、老年代、总收集时间、暂停时间等)
GC配置、堆配置、年轻代配置
GC配置、堆配置、年轻代配置
分配(TLAB分配、TLAB外分配)
分配(TLAB分配、TLAB外分配)
TLAB中分配-重点关注(可展示对象大小排序展示、TLAB总占用 大小&比例)
TLAB中分配-重点关注(可展示对象大小排序展示、TLAB总占用 大小&比例)
TLAB外分配(大小>2k对象 TLAB外的Eden区分配空间-重点关注-若此区域占用较大也可关注堆栈反思代码逻辑是否合理)
TLAB外分配(大小>2k对象 TLAB外的Eden区分配空间-重点关注-若此区域占用较大也可关注堆栈反思代码逻辑是否合理)

3.代码: 类加载、类卸载 信息 -重点关注

概览-展示 热点包 & 热点类
概览-展示 热点包 & 热点类
热点方法-重点关注
热点方法-重点关注
调用树-默认按照 线程堆栈 热点排序-重点关注
调用树-默认按照 线程堆栈 热点排序-重点关注
异常错误-重点关注-展示异常数 & 可查看异常堆栈定位异常堆栈详情-方便定位问题代码
异常错误-重点关注-展示异常数 & 可查看异常堆栈定位异常堆栈详情-方便定位问题代码
编译-展示标准编译 & OSR编译 信息-重点关注下是否有 失败的编译
编译-展示标准编译 & OSR编译 信息-重点关注下是否有 失败的编译
类加载 & 类卸载 统计
类加载 & 类卸载 统计

4.线程: 概览、热点线程、争用、等待时间、线程转储、锁定实例

概览-cpu占用率 & 活动线程数、守护线程数
概览-cpu占用率 & 活动线程数、守护线程数
热点线程-监控热点线程 选中热点线程其堆栈根可以展示出来-展开子树可查看其详细堆栈
热点线程-监控热点线程 选中热点线程其堆栈根可以展示出来-展开子树可查看其详细堆栈
争用-若有死锁或锁等待线程在此页面可以展示,定位死锁/锁等待代码
争用-若有死锁或锁等待线程在此页面可以展示,定位死锁/锁等待代码
等待时间-图中展示了线程休眠 造成 线程上下文切换 问题代码堆栈-可以做一个fix
等待时间-图中展示了线程休眠 造成 线程上下文切换 问题代码堆栈-可以做一个fix
线程转储-看着有点像 jstack 的输出
线程转储-看着有点像 jstack 的输出

5.I/O:  文件读取/写入 、 套接字读取/写入  -定位 IO 瓶颈(文件+网络) -重点关注

概览-文件概览
概览-文件概览
套接字概览
套接字概览
套接字读入-按照线程/事件  查看 跟踪树
套接字读入-按照线程/事件 查看 跟踪树

6.系统: 系统信息、 进程信息、环境变量信息 

概览
概览
进程
进程
环境变量
环境变量

7.事件: 按照事件维度展示 系统 发生 事件-展示方式 日志、图形、堆栈、直方图

概览-列举系统发生的事件 按照 类型 展示
概览-列举系统发生的事件 按照 类型 展示
事件日志-定位具体线程 & 事件详情信息
事件日志-定位具体线程 & 事件详情信息

我是架构师kimze,喜欢我的文章欢迎关注我,

我会坚持分享干货: 互联网微服务架构、云原生架构、行业动态、经典案例、技术趋势,

有问题欢迎关注私信或评论区回复交流

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java性能调优:利用JMC分析性能
  • JMC:Java Mission Control
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档