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