用JMX怎樣連線本地JVM上執行的Java程式
如果有人問你,如何用JMX連線本地JVM上執行的Java程式,你會怎麼回答?
其實,他只是想開發一個JMX的客戶端來配置一個本地Java程式。這個時候,千萬不要推薦JConsole,因為JConsole是一個通用的JMX客戶端,對主程式的效能存在負面影響。
在JConsole中,可以選擇PID來連線Java程式。但是在JMX的API中,卻找不到任何方法是使用PID作為引數的。這時候怎麼處理呢?
使用一些類似下面的程式來連線JMX伺服器,就可實現。不過,需要在執行伺服器時指定以下引數:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.ssl=false
為了繫結特定地址,還需要在增加下面的VM引數:
-Djava.rmi.server.hostname=A.B.C.D
這樣,你可以像下面的JMX客戶端程式碼一樣連線你的伺服器了:
String host = "localhost"; // or some A.B.C.D
int port = 1234;
String url = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi";
JMXServiceURL serviceUrl = new JMXServiceURL(url);
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceUrl, null);
try {
MBeanServerConnection mbeanConn = jmxConnector.getMBeanServerConnection();
// now query to get the beans or whatever
Set beanSet = mbeanConn.queryNames(null, null);
...
} finally {
jmxConnector.close();
}
當然也可以不使用VM引數,程式碼本身可以通過程式設計在指定埠號釋出,但這肯定就比現在的需求更復雜了。
如果要根據PID來連線,則需要使用Java 6以上的版本:
List vms = VirtualMachine.list();
for (VirtualMachineDescriptor desc : vms) {
VirtualMachine vm;
try {
vm = VirtualMachine.attach(desc);
} catch (AttachNotSupportedException e) {
continue;
}
Properties props = vm.getAgentProperties();
String connectorAddress =
props.getProperty("com.sun.management.jmxremote.localConnectorAddress");
if (connectorAddress == null) {
continue;
}
JMXServiceURL url = new JMXServiceURL(connectorAddress);
JMXConnector connector = JMXConnectorFactory.connect(url);
try {
MBeanServerConnection mbeanConn = connector.getMBeanServerConnection();
Set<ObjectName> beanSet = mbeanConn.queryNames(null, null);
...
} finally {
jmxConnector.close();
}
}
我已釋出過一個新的SimpleJMX包,該包能幫助很簡單的啟動一個JMX服務,並向遠端客戶端傳送beans。
//建立一個新的伺服器並監聽8000埠
JmxServer jmxServer = new JmxServer(8000);
//啟動伺服器
jmxServer.start();
//註冊下面定義的lookupCache物件
jmxServer.register(lookupCache);
jmxServer.register(someOtherObject);
//停止服務
jmxServer.stop();
該包確實有一個客戶端的介面,但是當前沒有人一種機制是可以通過PID來查詢程式的,只支援主機/埠的組合方式查詢。
推薦學習:Java高階應用視訊教程
文章來源:code
相關文章
- 如何用JMX連線本地JVM上執行的Java程式JVMJava
- 如何用JMX連線本地JVM的Java程式JVMJava
- 怎樣用好本地連線
- 怎麼在 JMX 中使用連線池
- 使用JMX Exporter監控Rainbond上的Java應用ExportAIJava
- java連線oracle執行sql語句JavaOracleSQL
- Jconsole與Jmx 分析JVM狀況(上)JVM
- 怎樣在 Kubernetes 上執行 PostgreSQLSQL
- 伺服器上的程式碼怎麼可以在本地測試執行Debug伺服器
- JVM程式用一個主執行緒來執行main()方法JVM執行緒AI
- 怎樣用c/c++程式設計連線mysql資料庫?C++程式設計MySql資料庫
- 蟲洞怎麼樣,用於遠端連線 iphone 進行測試iPhone
- vnc連線本地,vnc連線本地用的什麼軟體?3款好用推薦VNC
- 怎樣通過驅動程式連線到access
- 深入理解JVM(③)執行緒與Java的執行緒JVM執行緒Java
- Session的執行機制及怎樣適用於微信小程式中Session微信小程式
- 怎樣連線IDE介面燒錄機到Laptop上?IDEAPT
- 關於在執行java連線MongoDB時遇到的連線超時問題JavaMongoDB
- JS是怎樣執行的JS
- Webpack 是怎樣執行的?Web
- Java連線mysql的程式JavaMySql
- win10怎麼開啟本地連線 win10系統開啟本地連線的方法Win10
- 怎樣在sqlite3上執行SQL語句SQLite
- 《MySQL是怎樣執行的:從根兒上理解 MySQL》PDFMySql
- jvm-執行時資料區(程式計數器、Java虛擬機器棧、本地方法棧)JVMJava虛擬機
- 怎樣停止一個正在執行的執行緒執行緒
- jProfiler遠端連線Linux監控jvm、tomcat執行狀態LinuxJVMTomcat
- Oracle中表連線的執行原理Oracle
- 表連線的執行步驟
- Java呼叫本地可執行程式Java行程
- 可本地執行大模型的應用大模型
- Webpack 是怎樣執行的?(一)Web
- hibernate 中怎樣連線MYSQL??MySql
- 瞭解JDK、JRE、JVM及Java程式的編譯與執行JDKJVMJava編譯
- 圖解JVM記憶體模型及JAVA程式執行原理圖解JVM記憶體模型Java
- 用java連線mongodb並執行$match和$group結合的聚合函式的例項。JavaMongoDB函式
- 【JVM原始碼解析】虛擬機器解釋執行Java方法(上)JVM原始碼虛擬機Java
- 聯想K860怎樣用USB連線XP電腦,共享寬頻資源上網