gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:28:59 24 4
gpt4 key购买 nike

我们共享一个远程 Linux 盒子来开发各种 Java 应用程序,并使用 VisualVM 通过 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以获取占用的端口号并希望没有竞争),但我们想知道是否有更好的方法/我们是否做错了。

最佳答案

我最好的猜测是,您应该弄清楚是否有一种方法可以在没有-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 - 避免需要设置 jmxremote 端口(以远程使用 VisualVM)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9321871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com