我有一个在kubernetes管理的docker容器中运行的远程jvm应用程序:
java -jar /path/to/app.jar
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.rmi.port=1099
-Djava.rmi.server.hostname=127.0.0.1
当我尝试使用端口转发和VisualVM进行调试时,仅当我在本地计算机上使用端口1099时它才起作用。端口1098、10900或任何其他端口不起作用。这适用于VisualVM:kubectl port-forward <pod-name> 1099:1099
。 这不是: kubectl port-forward <pod-name> 1098:1099
我在VisualVM中使用“添加JMX连接”选项,连接到localhost:1099
或localhost:1098
。前者有效,后者无效。
为什么我不能在VisualVM上使用非1099端口?
UPD 我相信问题与VisualVM有关,因为无论我选择哪种本地端口,端口转发都可以正常工作。
$ kubectl port-forward <pod> 1098:1099
Forwarding from 127.0.0.1:1098 -> 1099
Forwarding from [::1]:1098 -> 1099
Handling connection for 1098
Handling connection for 1098
答案 0 :(得分:1)
用于连接到localhost
的完整JMX URL如下:
service:jmx:rmi://localhost:<port1>/jndi/rmi://localhost:<port2>/jmxrmi
... where <port1>
是用于导出RMIServer和RMIConnection远程对象的端口号,<port2>
是RMI注册表的端口号。
对于端口1098
,您可以尝试
service:jmx:rmi://localhost:1098/jndi/rmi://localhost:1098/jmxrmi
我猜如果没有明确配置,这两个端口默认为1099
。
编辑:根据评论,有效的JMX URL是:
service:jmx:rmi://localhost:1098/jndi/rmi://localhost:1099/jmxrmi