- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
这篇文章主要介绍Java Flight Recorder(JFR)和 Java Mission Control (JMC)组件。在本文结束时,你将能够监控、收集诊断数据并对任何正在运行的Java应用程序进行剖析。
首先,为什么我们需要另一个工具来监控 Java ?事实上,已经有几个选项可用于监控 Java 应用程序。你们中的许多人已经了解 VisualVM(请参阅本文了解更多信息:使用 VisualVM 监控 WildFly)和 JConsole(使用 JConsole 监控远程 WildFly 服务器)。
JDK Flight Recorder 是 Java 虚拟机 (JVM) 代码中附带的性能/诊断工具。以前作为 JRockit 的商业功能提供,您现在可以在常见的 OpenJDK 发行版中运行它,例如 OpenJDK 11。
在某种程度上,Java Flight Recorder 类似于 VisuaVM 或 JConsole 等典型的 Java 分析器。不过也有一些优势。
激活 Java Flight Recorder 的最简单方法是在启动时添加 JVM 选项 -XX:StartFlightRecording。例如,如果你想把它添加到 WildFly 应用服务器或 JBoss EAP,在 standalone.conf 文件中包含这个选项:
JAVA_OPTS="$JAVA_OPTS -XX:StartFlightRecording=duration=200s,filename=record.jfr"
在上面的命令中,我们在文件 record.jfr 中记录了 200 秒的数据。
另一方面,您也可以使用 jcmd 工具在正在运行的 Java 进程上激活 JFR 工具。除了进程 ID (PID) 之外,您还需要提供要执行的操作。
要开始飞行记录,请使用 JFR.start 诊断命令。例如,以下命令启动名为 monitor2hour 的记录,该记录最多保留 2 小时的数据,并将记录的大小限制为 250 兆字节。
$ jcmd pid JFR.start name=monitor2hour maxage=2h maxsize=250M
要在飞行记录运行时将数据写入文件,请使用 JFR.dump 诊断命令,如下所示:。
$ jcmd pid JFR.dump name=monitor2hour filename=monitor-dump.jfr
最后,使用 JFR.stop 命令停止记录诊断数据:
$ jcmd pid JFR.stop name=monitor2hour filename=debugrun1.jfr
JBang 是一个用于创建、编辑和运行自包含源 Java 程序的工具。您可以在此处阅读更多相关信息:JBang:像专业人士一样创建 Java 脚本
您可以在 JBang 脚本上应用 Flight Recorder,如下所示:
jbang --jfr application.java
默认情况下 –jfr 将启动飞行记录器转储事件记录到文件 application.jfr(因此使用脚本的基本名称作为其文件名)。
到目前为止,我们使用 **Java Flight Recorder 获得了记录器诊断数据。接下来,我们需要检查这些数据。为此,您可以使用 Java Mission Control Tool (JMC),它是一套用于 OpenJDK/Oracle JDK 的工具。
可以在 github 上找到 JMC 项目:https://github.com/openjdk/jmc
另一方面,一些操作系统(例如 RHEL 8)提供 jmc 工具作为其模块流的一部分。 JMC 还包含在适用于 Windows 的 OpenJDK 开发人员构建中。在本文中,我将通过三个简单的步骤向您展示如何在 Fedora 机器上安装 JMC:
// enable the copr repo
$ dnf copr enable almac/jmc8
// install jmc
$ sudo dnf install jmc
然后启动 jmc 命令以启动 Java Mission Control:
jmc
一旦开始,选择文件|打开文件 打开您的 JFR 文件。第一站是 Automated Analysis Results,其中包含每个问题(0 到 100)的 score 检测到的主要问题列表:
从这个角度来看,几个问题已经很明显了:
这些热点将在 Java 应用程序树中突出显示(带有橙色的“i”图标)。
JMC 用户界面的左侧包含一组指标,这些指标分为三个主要类别:
让我们更详细地了解 Java 应用程序 分支。
在 Java 应用程序 树视图中,您将找到所有区域的子集,包括线程、内存、锁实例、文件 I/O、套接字 I/O、方法分析、异常和线程转储。
如前所述,具有异常数据的子集显示 (i) 橙色图标。例如,Memory 元素显示了明显的内存使用问题(内存泄漏)。在 Stack Trace 下部选项卡中,您将能够指向有问题的方法:
另一个常见的分析元素是方法分析:它会告诉你热点在你的应用程序方法中的位置。例如,如果您遇到 CPU 密集型问题,方法分析信息将告诉您在哪里进行优化以使事情进展得更快。
在此 UI 的下部,您将找到每个事件的 Stack Trace 和 Flame View。
Flame View 提供更快的理解并缩短根本原因分析的时间。以下是如何阅读它:
然后,如果您的应用程序抛出大量 Exceptions,请切换到 Exceptions 视图。这将为您提供有关记录期间引发的异常数量以及它们的堆栈跟踪和详细信息的统计信息。浏览“概览”选项卡并检查您是否看到:
结论
本文是对 Java Flight Recorder 和 Java Mission Control 进行了介绍,它允许从任何角度监视和分析任何类型的 Java 应用程序。在下一篇文章中,我们将学习如何从 Eclipse 启动 Java Mission control。
我是 C 语言新手,我编写了这个 C 程序,让用户输入一年中的某一天,作为返回,程序将输出月份以及该月的哪一天。该程序运行良好,但我现在想简化该程序。我知道我需要一个循环,但我不知道如何去做。这是程序
我一直在努力找出我的代码有什么问题。这个想法是创建一个小的画图程序,并有红色、绿色、蓝色和清除按钮。我有我能想到的一切让它工作,但无法弄清楚代码有什么问题。程序打开,然后立即关闭。 import ja
我想安装screen,但是接下来我应该做什么? $ brew search screen imgur-screenshot screen
我有一个在服务器端工作的 UDP 套接字应用程序。为了测试服务器端,我编写了一个简单的 python 客户端程序,它发送消息“hello world how are you”。服务器随后应接收消息,将
我有一个 shell 脚本,它运行一个 Python 程序来预处理一些数据,然后运行一个 R 程序来执行一些长时间运行的任务。我正在学习使用 Docker 并且我一直在运行 FROM r-base:l
在 Linux 中。我有一个 c 程序,它读取一个 2048 字节的文本文件作为输入。我想从 Python 脚本启动 c 程序。我希望 Python 脚本将文本字符串作为参数传递给 c 程序,而不是将
前言 最近开始整理笔记里的库存草稿,本文是 23 年 5 月创建的了(因为中途转移到 onedrive,可能还不止) 网页调起电脑程序是经常用到的场景,比如百度网盘下载,加入 QQ 群之类的 我
对于一个类,我被要求编写一个 VHDL 程序,该程序接受两个整数输入 A 和 B,并用 A+B 替换 A,用 A-B 替换 B。我编写了以下程序和测试平台。它完成了实现和行为语法检查,但它不会模拟。尽
module Algorithm where import System.Random import Data.Maybe import Data.List type Atom = String ty
我想找到两个以上数字的最小公倍数 求给定N个数的最小公倍数的C++程序 最佳答案 int lcm(int a, int b) { return (a/gcd(a,b))*b; } 对于gcd,请查看
这个程序有错误。谁能解决这个问题? Error is :TempRecord already defines a member called 'this' with the same paramete
当我运行下面的程序时,我在 str1 和 str2 中得到了垃圾值。所以 #include #include #include using namespace std; int main() {
这是我的作业: 一对刚出生的兔子(一公一母)被放在田里。兔子在一个月大时可以交配,因此在第二个月的月底,每对兔子都会生出两对新兔子,然后死去。 注:在第0个月,有0对兔子。第 1 个月,有 1 对兔子
我编写了一个程序,通过对字母使用 switch 命令将十进制字符串转换为十六进制,但是如果我使用 char,该程序无法正常工作!没有 switch 我无法处理 9 以上的数字。我希望你能理解我,因为我
我是 C++ 新手(虽然我有一些 C 语言经验)和 MySQL,我正在尝试制作一个从 MySQL 读取数据库的程序,我一直在关注这个 tutorial但当我尝试“构建”解决方案时出现错误。 (我正在使
仍然是一个初学者,只是尝试使用 swift 中的一些基本函数。 有人能告诉我这段代码有什么问题吗? import UIKit var guessInt: Int var randomNum = arc
我正在用 C++11 编写一个函数,它采用 constant1 + constant2 形式的表达式并将它们折叠起来。 constant1 和 constant2 存储在 std::string 中,
我用 C++ 编写了这段代码,使用运算符重载对 2 个矩阵进行加法和乘法运算。当我执行代码时,它会在第 57 行和第 59 行产生错误,非法结构操作(两行都出现相同的错误)。请解释我的错误。提前致谢:
我是 C++ 的初学者,我想编写一个简单的程序来交换字符串中的两个字符。 例如;我们输入这个字符串:“EXAMPLE”,我们给它交换这两个字符:“E”和“A”,输出应该类似于“AXEMPLA”。 我在
我需要以下代码的帮助: 声明 3 个 double 类型变量,每个代表三角形的三个边中的一个。 提示用户为第一面输入一个值,然后 将用户的输入设置为您创建的代表三角形第一条边的变量。 将最后 2 个步
我是一名优秀的程序员,十分优秀!