Java如何獲取當(dāng)前進(jìn)程ID以及所有Java進(jìn)程的進(jìn)程ID
首先是獲取當(dāng)前Java運(yùn)行的Java進(jìn)程ID,這個(gè)是網(wǎng)上常見的,也就是Java程序自身將進(jìn)程ID打印出來:
package com.test; import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; public class Target { public static void main(String[] args) throws InterruptedException { System.out.println(getProcessID()); while(true) { Thread.sleep(10000); } } public static final int getProcessID() { RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean(); System.out.println(runtimeMXBean.getName()); return Integer.valueOf(runtimeMXBean.getName().split("@")[0]) .intValue(); } }
運(yùn)行結(jié)果:
2896@PC-20150603VRPL 2896
ManagementFactory是一個(gè)在運(yùn)行時(shí)管理和監(jiān)控Java VM的工廠類,它能提供很多管理VM的靜態(tài)接口,比RuntimeMXBean;
RuntimeMXBean是Java虛擬機(jī)的運(yùn)行時(shí)管理接口.
當(dāng)前進(jìn)程ID為2896。
但這種讓Java進(jìn)程自行打印ID的方式并不太好用,因?yàn)楹芏鄷r(shí)候我們是需要在不修改代碼另一個(gè)Java程序代碼的情況下知道這個(gè)正在運(yùn)行著的Java進(jìn)程的ID,如果你也有這個(gè)需求,可以看一下下面的解決方法:
獲取所有正在運(yùn)行著的Java進(jìn)程
package com.test; import java.util.HashSet; import java.util.Set; import sun.jvmstat.monitor.MonitoredHost; import sun.jvmstat.monitor.MonitoredVm; import sun.jvmstat.monitor.MonitoredVmUtil; import sun.jvmstat.monitor.VmIdentifier; public class ProcessID { public static void main(String[] args) throws Exception { // 獲取監(jiān)控主機(jī) MonitoredHost local = MonitoredHost.getMonitoredHost("localhost"); // 取得所有在活動(dòng)的虛擬機(jī)集合 Set<?> vmlist = new HashSet<Object>(local.activeVms()); // 遍歷集合,輸出PID和進(jìn)程名 for(Object process : vmlist) { MonitoredVm vm = local.getMonitoredVm(new VmIdentifier("http://" + process)); // 獲取類名 String processname = MonitoredVmUtil.mainClass(vm, true); System.out.println(process + " ------> " + processname); } } }
運(yùn)行結(jié)果:
2752 ------> 5172 ------> com.test.Target 5308 ------> com.test.ProcessID
這樣,就可以根據(jù)類名找到進(jìn)程號(hào)了。
MonitoredHost等類位于${JAVA_HOME}/lib/tools.jar
下面是一個(gè)可以直接根據(jù)類找到對(duì)應(yīng)Java進(jìn)程ID的方法:
package com.test; import java.net.URISyntaxException; import java.util.HashSet; import java.util.Set; import sun.jvmstat.monitor.MonitorException; import sun.jvmstat.monitor.MonitoredHost; import sun.jvmstat.monitor.MonitoredVm; import sun.jvmstat.monitor.MonitoredVmUtil; import sun.jvmstat.monitor.VmIdentifier; public class ProcessID { public static void main(String[] args) throws Exception { int pid = getProcess(Target.class); System.out.println("PID: "+pid); } public static int getProcess(Class<?> cls) throws MonitorException, URISyntaxException { if(cls == null) { return -1; } // 獲取監(jiān)控主機(jī) MonitoredHost local = MonitoredHost.getMonitoredHost("localhost"); // 取得所有在活動(dòng)的虛擬機(jī)集合 Set<?> vmlist = new HashSet<Object>(local.activeVms()); // 遍歷集合,輸出PID和進(jìn)程名 for(Object process : vmlist) { MonitoredVm vm = local.getMonitoredVm(new VmIdentifier("http://" + process)); // 獲取類名 String processname = MonitoredVmUtil.mainClass(vm, true); if(cls.getName().equals(processname)) { return ((Integer)process).intValue(); } } return -1; } }
運(yùn)行結(jié)果:
PID: 5172
源碼位于我的Github項(xiàng)目aoptracer的com.test包里
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java進(jìn)程cpu占用過高問題解決
- JAVA進(jìn)程突然消失問題解決方案
- Linux服務(wù)器Java進(jìn)程消失問題解決
- java生成jar包并且單進(jìn)程運(yùn)行的實(shí)例
- Java基礎(chǔ)強(qiáng)化訓(xùn)練輸入錯(cuò)誤即結(jié)束進(jìn)程
- 簡(jiǎn)述Java中進(jìn)程與線程的關(guān)系_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- 詳談java線程與線程、進(jìn)程與進(jìn)程間通信
- SHELL腳本監(jiān)控JAVA進(jìn)程的代碼
- java自帶的工具Jstack截取進(jìn)程中的堆棧信息
- 簡(jiǎn)要分析Java多進(jìn)程編程的并發(fā)控制
- 淺談Java多進(jìn)程程序的運(yùn)行模式
- 詳解Java中多進(jìn)程編程的實(shí)現(xiàn)
- java 進(jìn)程是如何在Linux服務(wù)器上進(jìn)行內(nèi)存分配的
相關(guān)文章
SpringBoot中異步調(diào)用時(shí)的注意事項(xiàng)
這篇文章主要介紹了SpringBoot中異步調(diào)用時(shí)的注意事項(xiàng),調(diào)用的異步方法,不能為同一個(gè)類的方法(包括同一個(gè)類的內(nèi)部類),簡(jiǎn)單來說,因?yàn)镾pring在啟動(dòng)掃描時(shí)會(huì)為其創(chuàng)建一個(gè)代理類,而同類調(diào)用時(shí),還是調(diào)用本身的代理類的,所以和平常調(diào)用是一樣的,需要的朋友可以參考下2023-11-11Elasticsearch開發(fā)AtomicArray使用示例探究
這篇文章主要為大家介紹了Elasticsearch AtomicArray使用示例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08JAVA求兩直線交點(diǎn)和三角形內(nèi)外心的方法
本文提供了JAVA求兩直線交點(diǎn)、三角形外心、三角形內(nèi)心的代碼和算法講解,大家可以參考使用2013-11-11Spring boot+mybatis+thymeleaf 實(shí)現(xiàn)登錄注冊(cè)增刪改查功能的示例代碼
這篇文章主要介紹了Spring boot+mybatis+thymeleaf 實(shí)現(xiàn)登錄注冊(cè)增刪改查功能的示例代碼,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07java實(shí)現(xiàn)將Webp轉(zhuǎn)為jpg格式方式
這篇文章主要介紹了java實(shí)現(xiàn)將Webp轉(zhuǎn)為jpg格式方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Java中的DelayQueue實(shí)現(xiàn)原理及應(yīng)用場(chǎng)景詳解
這篇文章主要介紹了Java中的DelayQueue實(shí)現(xiàn)原理及應(yīng)用場(chǎng)景詳解,DelayQueue是一個(gè)沒有邊界BlockingQueue實(shí)現(xiàn),加入其中的元素必需實(shí)現(xiàn)Delayed接口,當(dāng)生產(chǎn)者線程調(diào)用put之類的方法加入元素時(shí),會(huì)觸發(fā)Delayed接口中的compareTo方法進(jìn)行排序,需要的朋友可以參考下2023-12-12