獲取JAVA當前程序PID的兩種方法
阿新 • • 發佈:2019-02-12
之前並不知道Java中如何能夠獲取當前程序(也就是包含當前Java程式的JVM所在程序)的程序ID,還以為要通過JNI或者通過Runtime.exec執行shell命令等方式才能獲取到當前程序的程序ID,今天在偶然中看到一種在Java程式裡,獲取當前程序ID的方法,記錄下來,以後應該會用到:)
首先,從JDK1.5之後,Java開始提供包:java.lang.management
java.lang.management 提供了一系列的用來在執行時管理和監督JVM和OS的管理介面。
今天我將用到的就是這個包中的一個類:ManagementFactory。
獲取pid的程式程式碼如下:
- import sun.management.ManagementFactory;
- // get name representing the running Java virtual machine.
- String name = ManagementFactory.getRuntimeMXBean().getName();
- System.out.println(name);
- // get pid
- String pid = name.split("@")[0];
- System.out.println(“Pid is:” + pid);
輸出的結果如下:
-
25107@abc
- Pid is :25107
因此我們就可以從這個名字當中,截取出我們所需的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命令
- private static String getPid() throws IOException {
- Process p = Runtime.getRuntime().exec("/home/kent/opt/jdk1.6.0_41/bin/jps");
- InputStream in = p.getInputStream();
- List<String> jpsLines = IOUtils.readLines(in);
- IOUtils.closeQuietly(in);
- for (String line : jpsLines) {
- if (line.contains(HelloPoolSize.class.getSimpleName())) {
- return line.split("\\s")[0];
- }
- }
- throw new IllegalStateException("拿不到pid");
- }
這種方式可以獲取到本身以外的pid ,只要改一下類HelloPoolSize.class 就可以了!