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

时间:2019-04-18 18:32:14

标签: java jfr

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

客户详细信息

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

服务器详细信息

热点1.8.0_152, EL 雄猫

在Internet上,我可以选择以编程方式在服务器节点上启动JFR,这对我不起作用。

1 个答案:

答案 0 :(得分:3)

如果您具有终端访问权限,则可以创建脚本并使用命令行工具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访问服务器,或者不想在外壳中使用服务器,则可以使用JMX并发送与诊断命令相同的要求。

在JMC中,可以在Management / 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,但是它不受支持,没有记录,并且需要使用黑魔法来使其起作用。

相关问题