用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 Exporter監控Rainbond上的Java應用ExportAIJava
- 怎樣在 Kubernetes 上執行 PostgreSQLSQL
- 伺服器上的程式碼怎麼可以在本地測試執行Debug伺服器
- JVM程式用一個主執行緒來執行main()方法JVM執行緒AI
- java連線oracle執行sql語句JavaOracleSQL
- 【連載 03】Java 執行緒池(上)Java執行緒
- 線上JAVA應用平穩執行一段時間後出現JVM崩潰問題JavaJVM
- 深入理解JVM(③)執行緒與Java的執行緒JVM執行緒Java
- jProfiler遠端連線Linux監控jvm、tomcat執行狀態LinuxJVMTomcat
- 瞭解JDK、JRE、JVM及Java程式的編譯與執行JDKJVMJava編譯
- 關於在執行java連線MongoDB時遇到的連線超時問題JavaMongoDB
- 蟲洞怎麼樣,用於遠端連線 iphone 進行測試iPhone
- vnc連線本地,vnc連線本地用的什麼軟體?3款好用推薦VNC
- 怎樣通過驅動程式連線到access
- JS是怎樣執行的JS
- Webpack 是怎樣執行的?Web
- 分享一款JVM執行緒堆疊線上分析工具JVM執行緒
- Session的執行機制及怎樣適用於微信小程式中Session微信小程式
- jvm-執行時資料區(程式計數器、Java虛擬機器棧、本地方法棧)JVMJava虛擬機
- Finalshell 連線本地虛擬機器上的 ManjaroLinux虛擬機JARLinux
- 圖解JVM記憶體模型及JAVA程式執行原理圖解JVM記憶體模型Java
- 可本地執行大模型的應用大模型
- 怎樣停止一個正在執行的執行緒執行緒
- 《MySQL是怎樣執行的:從根兒上理解 MySQL》PDFMySql
- 怎樣在sqlite3上執行SQL語句SQLite
- 怎樣在windows上定時執行python指令碼WindowsPython指令碼
- JVM找出佔用CPU最高的執行緒JVM執行緒
- Webpack 是怎樣執行的?(一)Web
- win10怎麼開啟本地連線 win10系統開啟本地連線的方法Win10
- 【JVM原始碼解析】虛擬機器解釋執行Java方法(上)JVM原始碼虛擬機Java
- 理解Java程式的執行Java
- Java-JVM-執行時資料區JavaJVM
- Java程式碼寫好後怎麼執行?Java
- 執行緒池是怎樣工作的?執行緒
- 讀《mysql是怎樣執行的》有感MySql
- 在 WASI 上執行 .NET 7 應用程式
- JVM學習第一篇思考:一個Java程式碼是怎麼執行起來的-上篇JVMJava
- IIS連線數、併發連線數、最大併發工作執行緒數、應用程式池的佇列長度、應用程式池的最大工作程式數詳解執行緒佇列
- Windows 10 怎樣管理已連線過的無線網?Windows