编程语言
首页 > 编程语言> > java-是否可以通过代码从远程启动JFR监视/记录?

java-是否可以通过代码从远程启动JFR监视/记录?

作者:互联网

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

客户资料

热点JDK 1.8_131,
苹果系统,
捷米特4.0

服务器详细信息

热点1.8.0_152,
EL
雄猫

在Internet中,我获得了在服务器节点中以编程方式启动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中,可以在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,但是它不受支持,未记录,并且需要使用黑魔法来使其工作.

标签:jfr,java
来源: https://codeday.me/bug/20191108/2005699.html