繁体   English   中英

避免需要设置jmxremote端口(以远程使用VisualVM)?

[英]Avoid needing to set jmxremote ports (to use VisualVM remotely)?

我们共享一个用于开发各种Java应用程序的远程Linux机器,我们通过ssh使用VisualVM来对应用程序进行配置, 如此处所述 有什么方法可以在我们的Java进程上启用JMX /分析,而无需在我们的进程/用户之间分配/设置端口号? 必须始终确保仅指定(唯一)端口号才能启用性能分析,这很烦人。

为了使这一切更加具体:对端口进行硬编码显然不起作用,并且会发生冲突:

exec java -Dcom.sun.management.jmxremote.port=3000 ...

我们可以要求始终在运行进程时指定唯一的端口,但这很繁琐-您必须确保端口不与其他进程冲突,也不要与其他用户冲突:

exec java -Dcom.sun.management.jmxremote.port=$1 ...

目前,我们使用:

exec java -Dcom.sun.management.jmxremote.port=$(( $RANDOM + 2000 )) ...

但是我们仍然偶尔会碰到占用的端口号。

我们可以继续使用更高级的脚本(例如,查询netstat以获取占用的端口号并希望没有竞争),但是我们想知道是否有更好的方法/是否做错了。

我最好的猜测是,您应该弄清楚是否有一种方法可以在不使用-Dcom.sun.management.jmxremote.port=3000 ...情况下启动VM,然后再启动自己的MBeanServer连接器

http://www.docjar.com/html/api/sun/management/jmxremote/ConnectorBootstrap.java.html

Sun jvm似乎是根据传入的系统属性来启动连接器的地方,我认为阅读那里的代码将提供足够的信息以能够启动自己的MBeanServerConnector

http://docs.oracle.com/javase/1.5.0/docs/api/javax/management/remote/JMXConnectorServerFactory.html

如果您从JDK中读取代码,则传递给newJMXConnectorServer的环境变量似乎只是一个MAP,您也许能够发现要放入映射中的内容,以便它使用您自己的代码启动连接器,然后您可以编写自己的代码Java代码以选择可用的端口号。 我没有尝试过这种方法,但是它似乎很有前途,我真的很想回答您提出的问题。

JMXConnectorServer connServer = null;
  735           try {
  736               connServer =
  737                       JMXConnectorServerFactory.newJMXConnectorServer(url, env, mbs);
  738               connServer.start();
  739           } catch (IOException e) {
  740               if (connServer == null) {
  741                   throw new AgentConfigurationError(CONNECTOR_SERVER_IO_ERROR,
  742                           e, url.toString());
  743               } else {
  744                   throw new AgentConfigurationError(CONNECTOR_SERVER_IO_ERROR,
  745                           e, connServer.getAddress().toString());
  746               }
  747           }

一种可能的解决方案是在远程计算机上运行VisualVM,并使用vnc或远程X会话在本地计算机上显示VisualVM。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM