QCon 全球软件开发大会倒计时2个月!讲师已确认60%+ >>> 了解详情
写点什么

JAX London:使用 Java 飞行记录器实现生产环境的性能分析

  • 2016-10-27
  • 本文字数:1239 字

    阅读完需:约 4 分钟

在今年的 JAX London 上,来自甲骨文 Java 平台组的 Ola Westin 介绍了 Java 任务控制(Java Mission Control,JMC)和 Java 飞行记录器(Java Flight Recorder,JFR)的功能。

Westin 首先在整体上介绍了 JMC 和 JFR,然后为观众展示了如何创建和分析记录(recording)并为观众提供了一个样例。在本文中,InfoQ 将会带领读者回顾 Westin 的演讲。

Java 任务控制概览

Java 任务控制是一个图形化的界面,它借助 JMX 控制台(提供了服务器的原始视图)和 Java 飞行记录器(Java Flight Recorder)(收集、分析和诊断应用的数据)的帮助,能够可视化 Java 虚拟机(Java VM)的行为。

JMC(jmc 命令)打包在了 Java 开发工具集中(JDK),位于 bin 目录下。额外的日志可以通过使用 –consoleLog –debug选项来启用。各种体验式的插件(比如针对 DTrace、JMX 控制台的插件)也可以进行在 JMC 中进行下载。

Java 飞行记录器概览

Java 飞行记录器会收集 Java 应用程序以及 Java VM 的行为信息。JFR 构建在了 Java VM 之中,能够为用户提供运行时的信息。使用 JFR 并不会影响其他的 Java VM 优化,它的最小开销会小于 2%。

JFR 有不同的事件,比如即时事件(instant event)、持续事件(duration event)以及可请求事件(request-able event)。即时事件只会在某个时间点发生(比如线程启动),因此它的开销最小,但是持续事件(如垃圾收集等)是基于阈值的,与之类似,可请求事件(比如方法分析采样)基于可配置的时间段,因此这些事件的开销差异很大。

JFR 的采样性能分析器并不需要线程处于安全点上,也不会记录每个方法的调用(它只会探测热点方法)。按照该演讲所述,对于调用原生方法的线程,并没有与之相关的采样。

有两种不同类型的记录:固定时间(性能分析)的记录以及持续的记录,它们都会 dump 到一个文件中。

创建记录

要使用 JFR 来创建记录,我们需要在启动 JVM 的时候添加如下的命令行选项:-XX:+UnlockCommercialFeatures -XX:+FlightRecorder

从 Java 8 update 40 开始,我们还可以在运行时通过 JMC 或者jcmd方案来创建 JFR 记录。

如下的三幅图片分别展现了如何利用上述的三种方案来创建 JFR 记录。

我们还可以按照下图的方式记录远程的系统:

分析记录

在演讲中,Westin 强调在进行任何的深入调查之前,提出正确问题是非常重要的。接下来他给出了一个样例,这个样例阐述了“热点方法”的问题,如下所示:

在这里,当“Hot Methods” tab 选中的时候,我们可以看到 LinkedList.indexOf(Object) 占据了总采样数量的 97.35%。在深入研究调用栈的时候,我们发现在链式列表中有一个 contains(Object) 方法,这个方法需要 O(n) 的迭代。为了解决这个问题,Westin 运行了另外一个 JFR 记录,将 LinkedList 替换为 HashSet,它的结果如下所示:

随后,Westin 又介绍了两个样例:其中一个是关于线程竞争的,另一个是因为自动装箱所导致的内存分配。最后,他进行了总结展望,相关的 slide 如下所示:

查看英文原文 JAX London: Production Time Profiling Using Java Flight Recorder

2016-10-27 19:006376

评论

发布
暂无评论
发现更多内容

架构误区系列(Architecture Pitfall)

agnostic

构架师

数据库系统的组成

阿泽🧸

数据库 11月月更

零基础入门网络安全,收藏这篇不迷茫【2022最新】

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

夜幕下的湖畔音乐派对,华为音乐之夜为HDC 2022划上“聚”号

最新动态

披荆斩棘成功上岸美团、字节、华为,分享Java面经及答案

程序知音

Java java面试 后端技术 Java面试八股文

Go语言入门14—Channel

良猿

Go golang 后端 11月月更

如何在论文中画出漂亮的插图?

Jackpop

2022-11-06:给定平面上n个点,x和y坐标都是整数, 找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。 返回最短距离,精确到小数点后面4位。

福大大架构师每日一题

算法 rust 福大大

强引用、软引用、弱引用、幻象引用有什么区别和使用场景

共饮一杯无

Java 引用类型 11月月更

python的类的定义和使用

乔乔

11月月更

HEM亮相华为HDC2022开发者大会,助力企业数字化办公

最新动态

架构误区系列1:简单依靠扩容解决容量问题

agnostic

架构误区

使用TSDB自动检测时序数据的异常情况

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

小白入门:什么是CURD?

wljslmz

数据库 sql crud 11月月更

设计千万级学生管理系统的考试试卷存储方案

小虎

架构训练营

Github已经54k个star的Docker,到底是什么?

Jackpop

Verilog语法入门

攻城狮Wayne

Verilog 11月月更 组合逻辑电路

【云原生】Nacos-TaskManager 任务管理的使用

石臻臻的杂货铺

云原生 nacos 11月月更

对象可达性状态流转分析、显式地影响软引用垃圾收集

共饮一杯无

Java 11月月更 引用类型扩展

千万级学生管理系统试卷存储方案设计

π

架构实战营

猿创征文|点亮JAVA技术之灯(线程篇)

叶秋学长

Java 线程 教学 11月月更

设计模式之美-面向对象

GalaxyCreater

设计模式

极客时间架构训练营模块四作业

李晨

架构

第九期-模块五

wuli洋

为了面试字节,熬夜肝完这份Redis笔记后,我终于“硬”了一回

小小怪下士

Java redis 程序员 面试

模块四 -- 作业

李某人

架构训练营 #架构训练营

【愚公系列】2022年11月 微信小程序-app.json配置属性

愚公搬代码

11月月更

漏洞扫描的种类

穿过生命散发芬芳

漏洞扫描 11月月更

架构实战营模块四

Geek_408c99

纯css爱心代码-最近超级火的打火机与公主裙中的爱心代码(简易版)

肥晨

11月月更 跳动的爱心 代码爱心 爱心代码

Java引用类型(class、interface)用法总结详解

共饮一杯无

Java 11月月更 Java引用类型

JAX London:使用Java飞行记录器实现生产环境的性能分析_Java_Monica Beckwith_InfoQ精选文章