gpt4 book ai didi

java - 有没有办法通过代码从远程启动 JFR 监控/记录?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:18 30 4
gpt4 key购买 nike

我正在使用 Jmeter 通过 Ant 插件进行负载测试。目前在测试期间使用 JFR GUI 模式为每个节点捕获服务器的 JVM 指标。为每个节点启动很麻烦,有时会错过启动。有没有办法通过代码开始将它们一起做?

客户详情

热点 JDK 1.8_131,苹果系统,Jmeter 4.0

服务器详情

热点 1.8.0_152,欧陆, Tomcat

在互联网上,我获得了在服务器节点中以编程方式启动 JFR 的选项,这对我不起作用。

最佳答案

如果您有终端访问权限,您可以使用命令行工具 jcmd 创建脚本并开始录制。

$ jcmd <class/jarfile> VM.unlock_commercial_features
$ jcmd <class/jarfile> JFR.start

$ jcmd (to list available pids)
$ jcmd <pid> VM.unlock_commercial_features
$ jcmd <pid> JFR.start

详情请见 Example 2-1 Dynamic Interaction Using jcmd

如果您无法通过 SSH 访问服务器,或者不想在 shell 中访问,您可以使用 JMX 并发送与诊断命令相同的命令。

在 JMC 中,您可以在管理/JMX 控制台中检查服务器上的 MBean。在那里您会找到“com.sun.management/DiagnosticCommand”MXBean 和您可以针对其编写代码的操作。对象名称为 com.sun.management:type=DiagnosticCommand,您需要使用 jfrStart 调用它。

您可以像这样设置连接。

String host ="myHost";
int port = 1234;
HashMap map = new HashMap();
String[] credentials = new String[2];
credentials[0] = user;
credentials[1] = password;
map.put("jmx.remote.credentials", credentials);
String s = "/jndi/rmi://" + host + ":" + port + "/jmxrmi";
JMXServiceURL url = new JMXServiceURL("rmi", "", 0, s);
JMXConnector c= JMXConnectorFactory.newJMXConnector(url, map);
c.connect();
MBeanServerConnection conn = c.getMBeanServerConnection();

如果你不关心安全性,你可以将map设置为null。然后您创建一个对象名称并调用您想要执行的操作,例如:

ObjectName on = new ObjectName("com.sun.management:type=DiagnosticCommand"); 
Object[] args = new Object[] {
new String[] {
"dumponexit=true",
"filename=/recordings/rec.jfr",
"duration=600s"
}
};
String[] sig = new String[] {"[Ljava.lang.String;"};
conn.invoke(on, "jfrStart", args, sig);

在 JDK 9 及更高版本中有一个 FlightRecorderMXBean可用于远程访问(包括录音下载),但如果您卡在 JDK 8 上,我会执行上述操作。 Oracle JDK 8 中也有一个 MBean,但它不受支持,没有文档记录,需要黑魔法才能让它工作。

关于java - 有没有办法通过代码从远程启动 JFR 监控/记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55751927/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com