【问题标题】:Avoid needing to set jmxremote ports (to use VisualVM remotely)?避免需要设置 jmxremote 端口(远程使用 VisualVM)?
【发布时间】:2012-03-08 11:25:50
【问题描述】:

我们共享一个用于开发各种 Java 应用程序的远程 Linux 机器,并且我们使用 VisualVM over ssh 来分析应用程序as described here。有什么方法可以在我们的 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 以获取占用的端口号并希望没有竞争),但我们想知道是否有更好的方法/我们是否做错了。

【问题讨论】:

    标签: java jvm jmx jvm-hotspot visualvm


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我最好的猜测是,您应该弄清楚是否有一种方法可以在没有 -Dcom.sun.management.jmxremote.port=3000 ... 然后启动你自己的 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

      传递给 newJMXConnectorServer 的环境变量似乎只是一个 MAP,如果您从 JDK 读取代码,您可能能够发现在映射中放置什么,以便它使用您自己的代码启动连接器,然后您可以编写您自己的 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           }
      

      【讨论】:

      • 不从 Java 应用程序中启动服务器只是将问题向下推一层?它将允许端口查找更加健壮(因为我可以尝试多个端口,并且可能没有 TOCTTOU 竞赛),但我也想避免将其添加到我们正在处理的所有项目中.无论如何,我也希望有一些东西可以解决这个问题。
      猜你喜欢
      • 2021-04-30
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 2018-01-27
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      相关资源
      最近更新 更多