[Java故障排除指南- JDK11-学习笔记]-2-诊断工具JMC和JFR使用

2 诊断工具

2.1 诊断工具概述

Java Development Kit (JDK) 提供特定于各种操作系统的诊断工具和故障排除工具。还可以使用 JDK 提供的 API 开发自定义诊断工具

本节中描述的大多数命令行实用程序要么包含在 JDK 中,要么包含在本机操作系统工具和实用程序中。

尽管 JDK 命令行实用程序包含在 JDK 下载中,但重要的是要考虑到它们可用于诊断问题并监视使用 Java 运行时环境 (JRE) 部署的应用程序。

通常,诊断工具和选项使用各种机制来获取它们报告的信息。这些机制特定于虚拟机 (VM) 实现、操作系统和版本。通常,只有一部分工具适用于特定时间的给定问题。带有前缀的命令行选项-XX特定于 Java HotSpot VM

根据要排除的问题类型,工具和选项分为几类。某些工具和选项可能属于不止一类

  • 事后诊断工具和配置: 可用于在应用程序崩溃后诊断问题。请参阅事后诊断工具。

  • 挂起的进程工具: 可用于调查挂起或死锁的进程。

  • 监控工具: 可用于监控正在运行的应用程序。

  • 其他工具和配置可用于帮助诊断其他问题。

后面会详细来看每个分类下的工具

本节介绍的一些命令行实用程序是实验性的。jstack、jinfo和jmap实用程序都是实验性实用程序的例子。建议使用最新的诊断实用程序jcmd,而不是早期的jstack、jinfo和jmap实用程序。

2.2 JDK Mission Control (JMC)

2.2.1 JMC简介

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

JMC 非常小的性能开销是由于它与HotSpot VM紧密集成的结果。JMC 功能始终按需提供,其较小的性能开销仅在工具运行时有效。这种方法还消除了 观察者效应的问题,当监控工具改变系统的执行特性时就会出现这种现象。JMC 使您能够解决问题并确定根本原因和瓶颈。这些属性使 JMC 工具非常适合在生产中运行的应用程序

JMC 由以下客户端应用程序插件组成

  • JVM 浏览器显示正在运行的 Java 应用程序及其 JVM。

  • JMX 控制台是一种用于监视和管理 JVM 的机制。它连接到正在运行的 JVM,实时收集、显示其特征,并使您能够通过托管 Bean (MBean) 更改其某些运行时属性。您还可以创建触发某些事件的规则(例如,如果应用程序的 CPU 使用率达到 90%,则发送电子邮件)。

  • Flight Recorder (JFR) 是一种用于收集有关正在运行的 Java 应用程序的诊断和分析数据的工具。它被集成到 JVM 中,并导致非常小的性能开销,因此可以在生产环境中使用。JFR 不断保存有关正在运行的应用程序的大量数据。此分析信息包括线程样本、锁定配置文件和垃圾收集详细信息。JFR 在逻辑分组的表格和图表中显示诊断信息。它使您能够选择关注问题所需的时间范围和详细程度。在联系 Oracle 支持以帮助诊断 Java 应用程序问题时,JFR 收集的数据可能非常重要。

  • jcmd 实用程序 诊断命令用于向 JVM 发送诊断命令请求。这些请求对于管理来自 Flight Recorder 的记录、故障排除以及诊断 JVM 和 Java 应用程序很有用。
    插件有助于堆转储分析和 DTrace 记录。请参阅插件详细信息。JMC插件使用Java 管理扩展(JMX) 代理连接到 JVM。有关 JMX 的更多信息,请参阅Java 平台标准版 Java 管理扩展指南

2.2.2 使用 JDK Mission Control 进行故障排除

JMC 提供以下可帮助您进行故障排除的特性或功能:

  • Java 管理控制台 (JMX) 连接到正在运行的 JVM,并实时收集显示关键特征
  • 触发用户为 JVM 提供的自定义操作和规则。
  • JMC 工具的实验性插件提供故障排除活动。
  • JMC 中的飞行记录可用于分析事件。预配置的选项卡使您能够轻松地深入了解共同感兴趣的各个领域,例如代码、内存和垃圾收集、线程和 I/O。飞行记录的自动分析结果页面可帮助您更快地诊断问题。提供的规则和启发式方法可帮助您发现应用程序中的功能和性能问题,并提供调优技巧。一些使用相对未知概念的规则,如安全点,将提供解释和进一步信息的链接。一些规则是参数化的,可以配置为在您的特定环境中更有意义。可以根据需要启用或禁用单个规则。
    • JMC 应用程序中的飞行记录器在逻辑分组的表格、图表和刻度盘中显示诊断信息。它使您能够选择关注问题所需的时间范围和详细程度。
  • JMC 插件使用 Java 管理扩展 (JMX) 代理连接到 JVM。JMX 是一种标准 API,用于管理和监视应用程序、设备、服务和 Java 虚拟机等资源

在这里插入图片描述

2.3 飞行记录仪

2.3.1 简介

Flight Recorder (JFR) 是一个内置于 JDK 中的分析和事件收集框架。

Flight Recorder 允许 Java 管理员和开发人员收集有关 JVM 和 Java 应用程序行为方式的详细低级信息。您可以使用带有插件的 JMC 来可视化 JFR 收集的数据。Flight Recorder 和 JMC 共同创建了一个完整的工具链,以持续收集低级和详细的运行时信息,从而实现事后事件分析。

使用 JFR 的优点是:

它记录有关 JVM 事件的数据。您可以在特定时间记录事件
使用 JFR 记录事件使您能够保留执行状态以分析问题。您可以随时访问数据以更好地了解问题并解决问题。
JFR 可以在生产系统上记录大量数据,同时保持记录过程的开销很低。
它最适合记录延迟。它记录应用程序未按预期执行的情况,并提供有关瓶颈的详细信息。
它提供了对程序如何与整个执行环境交互的洞察,包括硬件、操作系统、JVM、JDK 和 Java 应用程序环境。

飞行记录可以在应用程序启动时或在应用程序运行时启动。数据被记录为称为事件的时间戳数据点。事件分类如下:

**持续时间事件:**发生在具有特定开始时间和停止时间的特定持续时间。
**即时事件:**立即发生并立即记录,例如,线程被阻塞。
**示例事件:**定期发生以检查系统的整体运行状况,例如每分钟打印一次堆诊断。
**自定义事件:**使用 JMC 或 API 创建的用户定义事件。

此外,录制模板中启用了预定义的事件。一些模板只保存非常基本的事件,对性能几乎没有影响。其他模板可能会带来轻微的性能开销,也可能会触发垃圾收集以收集额外的数据。目录中的 Flight Recorder 提供了以下模板<JDK_ROOT>/lib/jfr:

default.jfc:以低开销收集一组预定义的数据。
profile.jfc:提供比default.jfc模板更多的数据,但会产生开销并影响性能。
飞行记录器产生以下类型的记录:

时间固定记录:时间固定记录也称为分析记录,它会运行一段设定的时间,然后停止。通常,固定时间的录制会启用更多事件,并且可能会产生稍大的性能影响。可以根据您的要求修改打开的事件。时间固定的录音将被自动转储和打开。

时间固定记录的典型用例如下:

分析哪些方法运行得最多,以及创建最多对象的位置。

寻找使用越来越多堆的类,这表明存在内存泄漏。

寻找由于同步和更多此类用例而导致的瓶颈。

连续记录:连续记录是始终打开并保存例如最近六个小时的数据的记录。在此记录期间,JFR 收集事件并将数据写入全局缓冲区。当全局缓冲区填满时,最旧的数据将被丢弃。每当您请求转储或转储由规则触发时,缓冲区中的当前数据都会写入指定文件。

使用默认模板进行连续录制具有低开销并收集大量有用数据。但是,此模板不收集堆统计信息或分配分析。

2.3.2 制作飞行记录

2.3.2.1 开始飞行记录

如下图所示
在这里插入图片描述
不过可惜了这款工具应该是商业化工具
在这里插入图片描述

打开方式:

  • 在JVM 浏览器中找到您的JVM 。
  • 右键单击 JVM 并选择Start Flight Recording…
  • 开始飞行记录窗口打开 。

自定分析结果如下所示: 这里整一些图方便大家看一看
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3.2.2 在命令行中使用启动标志来生成飞行记录

在应用程序启动时使用启动标志开始录制。如果应用程序已经在运行,请使用该jcmd实用程序开始录制。

使用以下方法生成飞行记录:
启动应用程序时生成分析记录。
您可以使用该-XX:StartFlightRecording选项在应用程序开始时配置时间固定记录。以下示例显示了如何运行MyApp应用程序并在启动 JVM 20 秒后启动 60 秒录制,该录制将保存到名为 的文件中myrecording.jfr:

java -XX:StartFlightRecording.delay=20s,duration=60s,name=myrecording,filename=myrecording.jfr,settings=profile MyApp

settings 参数采用模板的名称。如果模板不在java-home/lib/jfr目录中,则包括路径,这是默认模板的位置。标准模板是:profile,它收集更多数据,主要用于分析记录,以及default,这是一种低开销设置,主要用于连续记录。

有关该java命令的 Flight Recorder 标志的完整描述,请参阅Java 平台标准版工具参考中的Java高级运行时选项。

启动应用程序时生成连续记录。
-XX:StartFlightRecording您可以使用该选项从命令行开始连续录制。提供用于管理录制的-XX:FlightRecorderOptions附加设置。这些标志开始连续记录,以后可以在需要时转储。以下示例显示了如何通过MyApp连续记录运行应用程序,将 6 小时的数据保存到磁盘。临时数据将保存到/tmp文件夹中。

java -XX:StartFlightRecording.disk=true,maxage=6h,settings=default -XX:FlightRecorderOptions=repository=/tmp MyApp

笔记:当您实际转储记录时,您为转储文件指定了一个新位置,因此存储库中的文件只是临时的。
使用诊断命令生成记录。
对于正在运行的应用程序,您可以使用 Java 命令行诊断命令生成记录。执行诊断命令的最简单方法是使用目录jcmd中的工具java-home/bin。有关更多详细信息,请参阅jcmd 实用程序。

以下示例显示如何MyApp使用进程 ID 为应用程序启动记录5361。记录并写入 30 分钟的数据/usr/recording/myapp-recording1.jfr。

jcmd 5361 JFR.start duration=30m filename=/usr/recordings/myapp-recording1.jfr

2.3.3 分析飞行记录

前面我们已经使用飞行纪录拿到了数据,如下图所示:在这里插入图片描述
这些指标数据如何分析呢:
分析 Java 应用程序
Java 应用程序仪表板显示 Java 应用程序的整体运行状况。

专注于具有黄色红色分数的参数。仪表板提供了对有问题的情况的准确参考。导航到特定页面以分析数据并修复问题。

线程
Threads页面提供了属于 Java 应用程序的所有线程的快照。它揭示了有关应用程序线程活动的信息,可以帮助您诊断问题并优化应用程序和 JVM 性能。

线程在一个表中表示,每一行都有一个关联的图表。图表可以帮助您识别有问题的执行模式。每个线程的状态以Stack Trace的形式呈现,它提供了您可以立即查看问题区域的上下文信息。例如,您可以轻松定位死锁的发生

锁定实例

锁实例提供了有关指定锁信息的线程的更多详细信息,即,如果线程正在尝试获取锁或等待关于锁的通知。如果线程获得了任何锁定,则详细信息将显示在堆栈跟踪中。

内存
检测应用程序性能问题的一种方法是查看它在运行时如何使用内存

在内存页面中,该图表示 Java 应用程序的堆内存使用情况。每个循环都由一个 Java 堆增长阶段组成,该阶段表示堆内存分配的周期,然后是一个表示垃圾回收的短暂下降,然后循环重新开始。图中的重要推论是内存分配是短暂的,因为垃圾收集器在每个周期将堆下推到起始位置。

选中垃圾收集复选框以在图表中查看垃圾收集暂停时间。它表明垃圾收集器在暂停时间内停止了应用程序以完成其工作。较长的暂停时间会导致应用程序性能不佳,这是需要解决的问题

方法分析
方法分析页面使您能够查看特定方法的运行频率以及运行方法所需的时间。通过识别需要大量时间执行的方法来确定瓶颈。

由于 profiling 会产生大量数据,所以默认不开启。开始新的录制并在事件设置下拉菜单中选择Profiling - on server 。进行短时间的固定时间录制。JFR 将记录转储到指定的文件名。在 JMC 中打开Method Profiling页面以查看最高分配。显示顶级包和类。验证堆栈跟踪中的详细信息。检查代码以验证内存分配是否集中在特定对象上。JFR 指向问题仍然存在的特定行号。

JVM 内部结构
JVM Internals页面提供了有关 JVM 及其行为的详细信息

要观察的最重要的参数之一垃圾收集。垃圾回收是删除未使用的对象以便空间可以用于分配新对象的过程。垃圾收集页面可帮助您更好地了解运行时的系统行为和垃圾收集性能。

这些图表显示了与暂停时间相比的堆使用情况以及在指定时间段内的变化情况。该页面还列出了录制期间发生的所有垃圾收集事件。观察堆的最长暂停时间暂停时间表明垃圾收集在应用程序处理期间花费的时间更长。这意味着垃圾回收在堆上释放的空间更少。这种情况会导致内存泄漏

有关有效的内存管理,请参阅编译页面,其中提供了有关代码编译的详细信息以及持续时间。在大型应用程序中,您可能有许多编译方法,并且内存可能会耗尽,从而导致性能问题。

环境
环境页面提供有关录制环境的信息。它有助于了解 CPU 使用率、内存和正在使用的操作系统

请参阅进程页面以了解正在运行的并发进程以及这些进程的竞争 CPU 使用率。如果许多进程使用 CPU 和其他系统资源,应用程序性能将受到影响。

检查事件浏览器页面以查看所有事件类型的统计信息。它可以帮助您专注于瓶颈并采取适当的措施来提高应用程序性能。

您可以使用事件浏览器页面创建自定义页面。从事件类型树中选择所需的事件类型,然后单击页面右上角的使用选择事件类型按钮创建新页面。自定义页面被列为事件浏览器页面下方的新事件页面。

技术咨询支持,可以扫描微信公众号进行回复咨询
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宋小生的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值