![](/img/trans.png)
[英]How to connect to a java program on localhost jvm using JMX?
[英]How to connect to JMX for JVM on local machine by pid (Java 9+)
我想在本地機器上運行的 JVM 上查詢 MBean。
String address = "???";
JMXConnectorFactory.connect(new JMXServiceURL(address))
.getMBeanServerConnection()
.getAttribute(new ObjectName("<object name>"), "<attribute name>");
我還沒有設置 com.sun.management.jmxremote.port=XXX,但由於 jconsole GUI 仍然能夠連接到 JVM 並在那里觀察/與 MBean 交互(我已經測試過),我認為這是可能的制作引用在特定 pid 上運行的 JVM 進程的地址字符串(因為不存在 jmxremote.port=XXX)。
但是,我找不到有關如何為具有指定 pid 的本地 JVM 進程構造地址的文檔。
5 年前有一些答案使用 sun.management.ConnectorAddressLink class,但是這個 class 已在 Java 9+ 中刪除。 我也嘗試過查看jmxlocal等幾個項目的源代碼,但所有這些項目現在都已過時,並且還使用相同的ConnectorAddressLink class現在不可用。
(我想您不是在詢問字符串的格式,而是在詢問如何找到端口。)
您可以就 jmx 端口的一些合同達成一致。 如果您在本地主機上有 2 個以上的 jvm,它們顯然會有不同的端口,因此 jmx 客戶端不能只是猜測或端口掃描(不良禮儀)。 也許是盲目嘗試連接的端口范圍。
您可以依靠其他東西,例如廣播數據包或多播頻道約定來請求您的程序顯示它們存在於某個 jmx 端口上,但是您必須自己編程並期望 jvm 啟動此類模塊。
否則,在 linux 上通過瀏覽 /proc/... 您可能會發現進程(僅過濾 java 的)以及它們打開的端口,或者使用 netstat(linux 或 windows)的某些運行時 exec backflips 您可能能夠列出偵聽套接字。 但同樣,這並不意味着這些套接字是 JMX 服務 - 您仍然需要一個約定,除非您想探測和麻煩進程的任意端口。
但是,如果您可以列出進程,您可能可以獲得它們的命令行並找到 java 的,以及它們自己的 jmx 系統屬性,揭示它們使用的端口......
很少有事情可以嘗試。 希望這可以幫助。
完整示例源代碼: https://github.com/banv-dev/DemoDumpHeap/blob/master/src/main/java/org/example/Main.java
//attach to VM with pid
VirtualMachine vm = VirtualMachine.attach("pid");
//Starts the local JMX management agent in the target virtual machine.
String jmxUrl = vm.startLocalManagementAgent()
//connect via JMX
JMXServiceURL url = new JMXServiceURL(jmxUrl);
JMXConnector connector = JMXConnectorFactory.connect(url);
MBeanServerConnection beanServerConnection = connector.getMBeanServerConnection();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.