开启 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

 




 


Jvm 性能分析工具-JMC+JFR 小记_等待时间


检查 & 解锁 开启JFR 收集


# JFR采集有两种方式:

  固定时长的采集

  持续不断的采集

# JFR采集策略 默认存储: /usr/local/jdk1.8.0_161/jre/lib/jfr

default.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.check

# 2.持续不断的采集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 性能分析工具-JMC+JFR 小记_环境变量_02


定位jvm进程信息


 




 


Jvm 性能分析工具-JMC+JFR 小记_死锁_03


查看当前执行的 JFR 任务


 




 


Jvm 性能分析工具-JMC+JFR 小记_等待时间_04


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




 


Jvm 性能分析工具-JMC+JFR 小记_堆栈_05


查看采集任务状态


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

打开效果试试看,主要分为以下部分:  标粗部分需重点关注

一般信息:  jvm信息 & 系统属性

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

代码: 类加载 / 类卸载 信息

线程:  概览[cpu占用率 & 活跃线程数 & 守护线程数 ]、热点线程、争用 [阻塞 & 受阻塞线程] 、等待时间[按等待时间排序线程]、线程转储[类似jstack功能]、锁定实例[定位死锁]

I/O:  文件IO+网络IO

系统:  进程 & 环境变量信息

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

1.一般信息: 




 


Jvm 性能分析工具-JMC+JFR 小记_等待时间_06


一般信息-堆内存使用量


 




 


Jvm 性能分析工具-JMC+JFR 小记_环境变量_07


一般信息-cpu占用率


 




 


Jvm 性能分析工具-JMC+JFR 小记_等待时间_08


一般信息-jvm信息


 




 


Jvm 性能分析工具-JMC+JFR 小记_等待时间_09


一般信息-系统属性


 




 


Jvm 性能分析工具-JMC+JFR 小记_死锁_10


一般信息-记录信息


 

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




 


Jvm 性能分析工具-JMC+JFR 小记_套接字_11


内存概览


 




 


Jvm 性能分析工具-JMC+JFR 小记_堆栈_12


垃圾收集(gc原因、回收前后空间、失败原因等)


 




 


Jvm 性能分析工具-JMC+JFR 小记_环境变量_13


gc时间(年轻代、老年代、总收集时间、暂停时间等)


 




 


Jvm 性能分析工具-JMC+JFR 小记_套接字_14


GC配置、堆配置、年轻代配置


 




 


Jvm 性能分析工具-JMC+JFR 小记_环境变量_15


分配(TLAB分配、TLAB外分配)


 




 


Jvm 性能分析工具-JMC+JFR 小记_环境变量_16


TLAB中分配-重点关注(可展示对象大小排序展示、TLAB总占用 大小&比例)


 




 


Jvm 性能分析工具-JMC+JFR 小记_死锁_17


TLAB外分配(大小>2k对象 TLAB外的Eden区分配空间-重点关注-若此区域占用较大也可关注堆栈反思代码逻辑是否合理)


 




 


Jvm 性能分析工具-JMC+JFR 小记_环境变量_18


 


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




 


Jvm 性能分析工具-JMC+JFR 小记_堆栈_19


概览-展示 热点包 & 热点类




 


Jvm 性能分析工具-JMC+JFR 小记_堆栈_20


热点方法-重点关注




 


Jvm 性能分析工具-JMC+JFR 小记_等待时间_21


调用树-默认按照 线程堆栈 热点排序-重点关注


 




 


Jvm 性能分析工具-JMC+JFR 小记_堆栈_22


异常错误-重点关注-展示异常数 & 可查看异常堆栈定位异常堆栈详情-方便定位问题代码


 




 


Jvm 性能分析工具-JMC+JFR 小记_等待时间_23


编译-展示标准编译 & OSR编译 信息-重点关注下是否有 失败的编译


 




 


Jvm 性能分析工具-JMC+JFR 小记_等待时间_24


类加载 & 类卸载 统计


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

 




 


Jvm 性能分析工具-JMC+JFR 小记_堆栈_25


概览-cpu占用率 & 活动线程数、守护线程数


 




 


Jvm 性能分析工具-JMC+JFR 小记_堆栈_26


热点线程-监控热点线程 选中热点线程其堆栈根可以展示出来-展开子树可查看其详细堆栈-不错


 




 


Jvm 性能分析工具-JMC+JFR 小记_堆栈_27


争用-若有死锁或锁等待线程在此页面可以展示,定位死锁/锁等待代码


 




 


Jvm 性能分析工具-JMC+JFR 小记_套接字_28


等待时间-图中展示了线程休眠 造成 线程上下文切换 问题代码堆栈-可以做一个fix


 




 


Jvm 性能分析工具-JMC+JFR 小记_环境变量_29


线程转储-看着有点像 jstack 的输出


 




 


Jvm 性能分析工具-JMC+JFR 小记_堆栈_30


 


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




 


Jvm 性能分析工具-JMC+JFR 小记_死锁_31


概览-文件概览


 




 


Jvm 性能分析工具-JMC+JFR 小记_环境变量_32


套接字概览


 




 


Jvm 性能分析工具-JMC+JFR 小记_死锁_33


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


 

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

 




 


Jvm 性能分析工具-JMC+JFR 小记_堆栈_34


概览


 




 


Jvm 性能分析工具-JMC+JFR 小记_堆栈_35


进程


 




 


Jvm 性能分析工具-JMC+JFR 小记_死锁_36


环境变量


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

 




 


Jvm 性能分析工具-JMC+JFR 小记_套接字_37


概览-列举系统发生的事件 按照 类型 展示


 




 


Jvm 性能分析工具-JMC+JFR 小记_环境变量_38


事件日志-定位具体线程 & 事件详情信息


 



作者:极简架构