首頁  >  文章  >  Java  >  Java如何取得目前進程ID以及所有Java進程的進程ID

Java如何取得目前進程ID以及所有Java進程的進程ID

黄舟
黄舟原創
2017-06-04 09:18:423127瀏覽

本篇文章主要介紹了Java如何取得目前進程ID以及所有Java進程的進程ID,具有一定的參考價值,有興趣的小夥伴們可以參考一下

首先是取得目前Java運行的Java進程ID,這個是網路上常見的,也就是Java程式本身將進程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(); 
  } 

}

運行結果:

2896@PC-20150603VRPL
2896

ManagementFactory是一個在執行時管理和監控Java VM的工廠類,它能提供很多管理VM的靜態介面,比RuntimeMXBean;

RuntimeMXBean是Java虛擬機的運行時管理介面.

目前進程ID為2896。

但這種讓Java進程自行列印ID的方式並不太好用,因為很多時候我們是需要在不修改程式碼另一個Java程式碼的情況下知道這個正在運行的Java進程的ID,如果你也有這個需求,可以看一下下面的解決方法:

取得所有正在執行的Java進程

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 {
     // 获取监控主机
     MonitoredHost local = MonitoredHost.getMonitoredHost("localhost");
     // 取得所有在活动的虚拟机集合
     Set<?> vmlist = new HashSet<Object>(local.activeVms());
     // 遍历集合,输出PID和进程名
     for(Object process : vmlist) {
       MonitoredVm vm = local.getMonitoredVm(new VmIdentifier("//" + process));
       // 获取类名
       String processname = MonitoredVmUtil.mainClass(vm, true);
       System.out.println(process + " ------> " + processname);
     }
   }
}

執行結果:

2752 ------> 
5172 ------> com.test.Target
5308 ------> com.test.ProcessID

這樣,就可以根據類別名稱找到進程號了。

MonitoredHost等類別位於${JAVA_HOME}/lib/tools.jar

以下是一個可以直接根據類別找到對應Java進程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;
    }

    // 获取监控主机
    MonitoredHost local = MonitoredHost.getMonitoredHost("localhost");
    // 取得所有在活动的虚拟机集合
    Set<?> vmlist = new HashSet<Object>(local.activeVms());
    // 遍历集合,输出PID和进程名
    for(Object process : vmlist) {
      MonitoredVm vm = local.getMonitoredVm(new VmIdentifier("//" + process));
      // 获取类名
      String processname = MonitoredVmUtil.mainClass(vm, true);
      if(cls.getName().equals(processname)) {
        return ((Integer)process).intValue();
      }
    }
    return -1;
  }
}

運行結果:

PID: 5172

#源碼位於我的Github專案aoptracer的com.test套件裡

以上是Java如何取得目前進程ID以及所有Java進程的進程ID的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn