1. 程式人生 > >獲取JAVA當前程序PID的兩種方法

獲取JAVA當前程序PID的兩種方法

之前並不知道Java中如何能夠獲取當前程序(也就是包含當前Java程式的JVM所在程序)的程序ID,還以為要通過JNI或者通過Runtime.exec執行shell命令等方式才能獲取到當前程序的程序ID,今天在偶然中看到一種在Java程式裡,獲取當前程序ID的方法,記錄下來,以後應該會用到:)

首先,從JDK1.5之後,Java開始提供包:java.lang.management

java.lang.management 提供了一系列的用來在執行時管理和監督JVM和OS的管理介面。

今天我將用到的就是這個包中的一個類:ManagementFactory。 

獲取pid的程式程式碼如下:

  1. import sun.management.ManagementFactory;    
  2. // get name representing the running Java virtual machine.
  3. String name = ManagementFactory.getRuntimeMXBean().getName();  
  4. System.out.println(name);  
  5. // get pid
  6. String pid = name.split("@")[0];  
  7. System.out.println(“Pid is:” + pid);  

輸出的結果如下:

  1. 25107@abc
    .mmm.xxx.yyy.com  
  2. Pid is :25107
第一行列印的是代表執行時JVM的一個名字,我們可以看到,這個名字是以程序pid開頭,以機器名結尾,中間用“@”連線而成的。

因此我們就可以從這個名字當中,截取出我們所需的pid了。

當然,這只是java.lang.management包中的一個小功能,該包還提供了很多其他的管理介面,參照Javadoc如下:

Interface Summary
The management interface for the class loading system of the Java virtual machine.
The management interface for the compilation system of the Java virtual machine.
The management interface for the garbage collection of the Java virtual machine.
The management interface for a memory manager.
The management interface for the memory system of the Java virtual machine.
The management interface for a memory pool.
The management interface for the operating system on which the Java virtual machine is running.
The management interface for the runtime system of the Java virtual machine.
The management interface for the thread system of the Java virtual machine.

第二種方法:解析JPS命令

  1. private static String getPid() throws IOException {  
  2.       Process p = Runtime.getRuntime().exec("/home/kent/opt/jdk1.6.0_41/bin/jps");  
  3.       InputStream in = p.getInputStream();  
  4.       List<String> jpsLines = IOUtils.readLines(in);  
  5.       IOUtils.closeQuietly(in);  
  6.       for (String line : jpsLines) {  
  7.           if (line.contains(HelloPoolSize.class.getSimpleName())) {  
  8.               return line.split("\\s")[0];  
  9.           }  
  10.       }  
  11.       throw new IllegalStateException("拿不到pid");  
  12.   }  

這種方式可以獲取到本身以外的pid ,只要改一下類HelloPoolSize.class 就可以了!