recorder_将Java Flight Recorder与OpenJDK 11一起使用

recorder

Java Flight Recorder(JFR)曾经是Oracle JDK的商业附加组件。 由于它最近与Java Mission Control一起开源,因此使用OpenJDK 11的每个人现在都可以免费使用此出色的工具对Java应用程序进行故障排除。 JFR以前是专有解决方案,对于那些依赖OpenJDK早期版本的人来说,它可能鲜为人知。 因此,我认为有必要写一篇有关在OpenJDK 11中使用JFR的新文章。

Java飞行记录器

1.概述

关于Java Flight Recorder

JFR是一种分析工具,用于从正在运行的Java应用程序中收集诊断信息和分析数据。 它的性能开销可以忽略不计,通常低于1%。 对于运行时间较短的应用程序,此开销可能会超出该开销,因为JFR在启动时需要一些预热时间。

使用JFR诊断错误的应用程序可能会大大缩短解决时间。 异常从出现的最初就可以看出,随着它的发展,最终直到导致应用程序崩溃的那一点。 当然,并非所有问题都那么严重。 JFR收集有关正在运行的线程,GC周期,锁,套接字,内存使用量以及更多内容的数据。

Java Flight Recorder开源

正如我在介绍中提到的那样,该功能曾经是Oracle JDK的专有功能,并且正式地它仅适用于付费的Oracle客户。 实际上,您可以使用-XX:+UnlockCommercialFeatures -XX:+FlightRecorder标志启用它,并且早期的JVM不会强制使用许可证密钥或类似的东西。

Oracle公司的Mark Reinhold希望更快地推动Java的发展,并从某些发布周期为六个月的Linux操作系统中汲取了灵感。 我认为他可能想到过Ubuntu,尽管他没有提及。 但是,从版本9开始的Java SE确实具有可预测的六个月发布周期。

长话短说,为了缩短发布时间,他们现在在单一代码库上工作,这使得Oracle JDK和OpenJDK构建可以互换。 最终, 从Java 11开始,Oracle在开源GPL和商业许可下提供了JDK版本 。 如果您习惯于免费获取Oracle JDK二进制文件,请下载OpenJDK构建,它们在功能上是相同的。

结果,JFR获得了开源,并通过单一代码库简化了发布过程,从而使OpenJDK对开发人员更具吸引力。

JFR包装差异

使用-XX:+UnlockCommercialFeatures选项时,Oracle JDK 11会发出警告,而OpenJDK无法识别此选项并报告错误。

Java Mission Control也是开源的

JMC是用于打开JFR产生的生产时间性能和诊断记录的客户端工具 。 JMC还提供了其他功能,例如JMX控制台和堆转储分析器。 从7到10的Oracle JDK版本包含JMC,但已将其分离,现在可以单独下载获得 。

JMC最近也已经开源 ,这意味着现在使用OpenJDK 11的任何人都可以使用整个工具集(JFR + JMC)。在撰写本文时,第一个开源JMC版本7尚未发布到GA,但是提供了早期访问版本。

Java飞行记录器

2.使用飞行记录器

我一直没有在生产中连续使用JFR,因为那样会违反Oracle JDK的许可证。 为了发展,一切都可以根据我的最佳知识来使用。 因此,使用Oracle JDK的人们(没有支持合同)最终不得不在其开发机器上本地重现性能问题。

好吧,那么,让我们看一些代码。 这将是对Java Flight Recorder的基础知识的简单演示,我在为给我们一些调试目的方面有些麻烦。

public class OOMEGenerator {static BlockingQueue<byte[]> queue = new LinkedBlockingQueue<>();public static void main(String[] args) {new Thread(new Consumer()).start();new Thread(new Producer()).start();}static class Producer implements Runnable {public void run() {while (true) {queue.offer(new byte[3 * 1024 * 1024]);try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}}}}static class Consumer implements Runnable {public void run() {while (true) {try {queue.take();Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}}}

为了展示经典的OOME,我们可以将新对象添加到集合中。 我选择了这一模式,因为我经常在生产中看到这种特殊模式。 也就是说,有两个(或更多)组件,其中一些产生新的对象,而某些消耗这些对象。 该问题源于以下事实:组件用来通过其进行通信的内部缓冲区的容量可能不受限制。

当我说可能是无界的时,我的意思是缓冲区大小乘以一个平均对象的大小,它是如此之大,一段时间后,它只是吞噬了所有堆空间。 通常可能要花费数小时,数天或一周的时间,但最终会发生OutOfMemoryError

开发人员通常认为在日志中看到OutOfMemoryError肯定反映了编程错误和内存泄漏。 有时,堆转储分析可以肯定地确认或混淆这一点,但是在某些情况下,它不是黑色还是白色,而您根本无法分辨。 在这些情况下,具有历史数据的JFR成为资源。

启用JFR

我们可以从上面的简短程序中看到一个OutOfMemoryError ,它需要一些时间,但是这将会发生。 借助JFR,我们可以详细了解GC的时间,CPU使用率以及许多其他方面的时间过程以及错误的特征。

% java \-Xmx1024m \-Xlog:gc*=debug:file=gc.log:utctime,uptime,tid,level:filecount=10,filesize=128m \-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump.hprof \-XX:StartFlightRecording=\disk=true, \dumponexit=true, \filename=recording.jfr, \maxsize=1024m,\maxage=1d,\settings=profile \path-to-gc-roots=true \OOMEGenerator Started recording 1.
Use jcmd 5469 JFR.dump name=1 to copy recording data to file.Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat nl.wizenoze.storm.OOMEGenerator.main(OOMEGenerator.java:12)22.31s user 3.46s system 24% cpu 1:43.94 total

我在生产中使用这些调试设置。 从这种意义上说,这些JVM参数也为我自己提供了一个注释,当我需要它们时,我会在这里找到它们。

与JFR相关的是突出显示的部分(第5-11行)。 默认情况下,记录的最大大小,最长的期限或记录的数据均不受限制。 我尝试了各种设置,并应用了maxagemaxsize被证明是有用的。 在早期的JDK版本中,JFR曾经具有更多设置,但是在版本11中它们简化了它们。

我想提醒您注意dumponexit选项。 在正常情况下,通常在停止捕获数据时将记录写入磁盘。 当JVM终止时,自然会发生这种情况。 但是,根据我的经验,当终止异常时,例如当堆空间不足时,则记录的大小可能为零字节。 尽管JFR设置的文档不是很清楚dumponexit有什么区别,但是我观察到,应用它对于从有问题的JVM中捕获数据是有利的。

JFR带有两个出厂的配置文件( defaultprofile ),它们定义了应将哪些事件保留到捕获的记录中。 如果未指定设置选项,则使用default配置文件。 在此示例中,我使用了更广泛的配置文件事件定义,还启用了跟踪GC根目录的路径。 这些会给运行中的JVM带来更高的开销,我不建议在生产环境中使用它们。

按需捕获记录

只要有JVM,就会将性能数据写入磁盘,但是可以在任何给定时间使用JCMD实用程序按需导出记录。 JFR.check命令返回有关当前正在运行的记录的详细信息。

% jcmd PID JFR.check name=1
14647:
Recording 1: name=1 maxsize=1.0GB maxage=1d (running)

除此之外, JFR.dump允许您导出到目前为止已记录的所有内容,而不必等待正在运行的JVM终止或停止记录。

%jcmd 5469 JFR.dump name=1 filename=dump.jfr

JCMD实用程序提供了其他故障排除选项 。

分析JFR录音

如前所述,JMC必须单独下载。 尽管它只是一个早期访问版本,但我发现它完全可用,而没有遇到重大故障。 在JMC 6中,添加了“自动分析结果”屏幕,以帮助工程师更快地诊断问题。 我一直在使用较旧的JMC 5.5版本,发现此版本很有用,并且确实提供了有用的技巧。 它已正确地将OOMEGenerator$Producer标识为正在生成的源或大对象,并且还建议平衡线程之间的分配率。

Java飞行记录器

从内存视图的角度来看,它是可以的,它提供了堆使用情况的图表,但是由于某些原因,缺少了对象直方图列表中的数字。 由于JMC的较旧版本无法打开此录音,因此我不知道该录音的样子。 我认为这可能是一个错误。

Java飞行记录器

看到GC暂停时间以及堆大小分配更改也很有用,但是在较早的JMC版本中,这种情况看起来更好。

Java飞行记录器

3.注意事项

  • JFR记录不向后兼容 -由OpenJDK 11产生的记录不向后兼容,并且较旧的JMC版本(尝试5.5和6)不会打开它们
  • JMC 7仍是一个早期访问版本 – GA中的功能可能会更改,某些错误可能会在此处和那里出现。
  • 官方Docker映像中存在一个错误 –启用JFR时阻止JVM启动
  • JMC 7无法分析HPROF文件 -尽管OpenJDK的Wiki声明它能够做到这一点

4。结论

Java Flight Recorder(JFR)是一种概要分析工具,用于从正在运行的Java应用程序中收集诊断信息和概要分析数据。 它收集有关正在运行的线程,GC周期,锁,套接字,内存使用量以及更多内容的数据。 JFR和Java Mission Control(一种用于分析记录的工具)已经开源,并且不再是Oracle的专有产品。 Oracle的这一举动使OpenJDK对开发人员更具吸引力。

从11版开始,Java Mission Control尚未与JDK捆绑在一起,但可以单独下载获得 。

使用伪应用程序,我们有意生成了OutOfMemoryError ,捕获了堆转储和JFR记录,并使用JMC分析了后者。

JFR和JMC是OpenJDK开源领域中的新事物,OpenJDK 11在撰写本文时也很新,因此必须经过一段时间才能使这些工具成熟。

翻译自: https://www.javacodegeeks.com/2018/12/using-java-flight-recorder-openjdk-11.html

recorder

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 酒店管理设计_酒店管理系统的设计与实现(Myeclipse,MySQL)

酒店管理系统的设计与实现(Myeclipse,MySQL)(任务书,开题报告,中期检查表,文献综述,外文翻译,毕业论文12000字,程序代码,MySQL数据库)本系统是一个酒店管理系统&#xff0c;以Java Web技术为基础&#xff0c;采用MVC设计模式&#xff0c;利用MyEclipse编程平台结合MySQL数据库&…

可以在循环体内声明局部变量吗?

循环体声明的局部变量&#xff0c;第一次创建后&#xff0c;后面每次循环就不会再创建了。因为 JVM 在执行创建局部变量代码时&#xff0c;会先查询是否存在同名的局部变量&#xff0c;若存在则不会创建。如果有赋值&#xff0c;则直接删除旧的数据&#xff0c;保存新的数据&am…

传一个实体一个string_没想到,一个小小的String还有这么多窍门

1. 看看源码大家都知道&#xff0c; String 被声明为 final&#xff0c;因此它不可被继承。(Integer 等包装类也不能被继承&#xff09;。我们先来看看 String 的源码。在 Java 8 中&#xff0c;String 内部使用 char 数组存储数据。在 Java 9 之后&#xff0c;String 类的实现…

envoy api 网关_在边缘,作为网关或在网格中构建控制平面以管理Envoy代理的指南...

envoy api 网关最近&#xff0c; Envoy已成为流行的网络组件。 马特克莱因&#xff08; Matt Klein &#xff09;在几年前写了一个博客&#xff0c;内容涉及Envoy的动态配置API&#xff0c;以及它如何成为Envoy的采用曲线向右移的部分原因。 他称该博客为“通用数据平面API”。…

d3.js和mysql_如何从mysql数据库中提取数据并使用D3.JS进行可视化?

以下是一个php脚本,您应该可以将其保存在某个文件中(假设您称之为“getdata.php”),可以从您的HTML文件中访问,其中包含D3代码.调用时,它将以json格式从MySQL数据库返回数据(只要数据库服务器不在您的域之外);$username "******";$password "******";$ho…

apigee 安装_APIGEE – API网关简介

apigee 安装在本文中&#xff0c;我想简要介绍一下APIGEE。 APIGEE主要提供现成的以下功能作为api网关。 协议转换 与任何协议&#xff08;包括SOAP&#xff0c;REST&#xff0c;XML二进制或自定义&#xff09;进行转换 交通管理 开箱即用的灵活&#xff0c;分布式配额管理…

linux mysql 忘记root密码_Linux MySQL忘记root密码解决方案

在使用MySQL数据库时&#xff0c;由于某些原因长时间没有登陆MySQL&#xff0c;或者由于工作交接完成度不高&#xff0c;导致数据库root登陆密码忘记&#xff0c;如何解决&#xff1f;一、更改my.cnf配置文件1、用命令编辑/etc/my.cnf配置文件&#xff0c;即&#xff1a;vim /e…

Java编程中如何获取项目文件的路径/文件路径

// 获取类加载器 ClassLoader cl JDBCUtils.class.getClassLoader(); // 获取文件的统一资源定位器对象 URL url cl.getResource("db_config.properties"); // 获取文件的路径 String path url.getPath();

inmemory_通过Spring Boot了解H2 InMemory数据库

inmemory介绍 基本上&#xff0c;数据库设置涉及几个步骤&#xff0c;然后才能在应用程序中通过已配置的数据源使用它。 在实际项目实施中&#xff0c;这实际上是必需的。 但是&#xff0c;在某些情况下&#xff0c;我们只需要为某件事完成POC&#xff0c;并且整个数据库设置工…

mysql 查询分组平均数_9、mysql分组查询-----group by 和 having

举例说明&#xff1a;有 Store_Information表之前我们根据这个表&#xff0c;用函数可以算出sales的总和&#xff0c;平均数等如果现在我们需要算出每一间店(store_name)的销售总额(sales)呢&#xff1f;比如&#xff1a;1、los angeles 销售额加起来是 18000san diego…

macOS彻底卸载/删除Microsoft相关的程序

cd /Library/Application\ Support/ # 可以将目录Microsoft整个删除 sudo rm -rf Microsoft # 如果要单独删除微软的自动更新程序&#xff0c;可以进入 cd Microsoft/MAU2.0 # 删除程序文件Microsoft AutoUpdate.app sudo rm -rf Microsoft\ AutoUpdate.app # 进入~/Library/Pr…

java 字符串文字筛选_重新开始Java的原始字符串文字讨论

java 字符串文字筛选在2018年12月宣布 将从JDK 12中删除原始字符串文字 。 现在&#xff0c;在新的一年中&#xff0c;与Java中原始字符串文字的设计有关的讨论又开始了。 在琥珀色专家OpenJDK邮件列表上的“ 原始字符串文字-重新开始讨论 ”一文中 &#xff0c;Brian Goetz参…

mysql event 日志_MySQL Event计划任务刷慢日志

前言最近在尝试一个日志系统graylog来收集mysql的慢查询日志提&#xff0c;供后续的分析、监控和报警等。测试步骤已经到日志已成功收集到graylog&#xff0c;测试时需要刷一些慢查询日志出来。为了刷比较多的日志和不对测试环境造成较大的影响&#xff0c;想到了使用mysql的sl…

aws lambda_API网关和AWS Lambda进行身份验证

aws lambda当Foreach最初踏上微服务之路时&#xff0c;我们并没有真正构建微服务。 我们以为我们做到了&#xff0c;但是我们所有的服务中总存在一些逻辑。 当然&#xff0c;每个服务实际上应该只专注于自己的任务&#xff0c;而不应该专注于属于另一个微服务的事物。 我们这方…

refreshtoken用mysql_微信access_token和refresh_token保存于redis

此处以保存用户授权access_token为例&#xff0c;接口调用access_token可在项目启动时进行缓存。部分代码如下&#xff1a;Autowiredprivate RedisTemplate redisTemplate;Value("${myapp.redisWxUserAccessToken}")private String redisWxUserAccessToken;// 获取pu…

JDBC的基本使用

文章目录概念基本使用步骤详解各个对象DriverManager注册驱动获取数据库连接Connection获取执行 SQL 语句的对象事务管理Statement执行 SQL 语句ResultSetPreparedstatement概念 Java DataBase Connectivity Java 数据库连接&#xff0c;即使用 Java 语言操作数据库 JDBC本质…

sqlrelay mysql_php+sqlrelay+mysql实现连接池及读写负载均衡

phpsqlrelaymysql实现连接池及读写负载均衡上一篇 /下一篇 2008-04-02 18:25:19/ 个人分类&#xff1a;MySQL作者&#xff1a;ziqiusqlrelay.jpg(20.33 KB)2007-8-31 14:26在大型的web应用中数据库经常成为并发访问的一个瓶颈&#xff0c;为了有效的解决并发访问的瓶颈&#x…

maven 文件上传下载_使用Maven将文件上传和下载到S3

maven 文件上传下载多年来&#xff0c;我已经看到许多团队以许多不同的方式使用Maven。 Maven可用于许多ci / cd任务&#xff0c;而无需使用额外的管道代码&#xff0c;或者可用于在运行某些测试之前准备开发环境。 通常&#xff0c;它是一种方便的工具&#xff0c;在Java团队…

JDBC的事务管理

文章目录事务定义操作步骤示例代码事务定义 一个包含多个步骤的业务操作。如果这个业务操作被事务管理&#xff0c;则这多个步骤要么同时成功&#xff0c;要么同时失败。 操作步骤 使用 Connection 对象来管理事务。 1.开启事务 2.提交事务 3.回滚事务 开启事务: setAutoC…