欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java如何获取当前进程ID以及所有Java进程的进程ID

程序员文章站 2024-02-13 13:00:52
首先是获取当前java运行的java进程id,这个是网上常见的,也就是java程序自身将进程id打印出来: package com.test; import...

首先是获取当前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项目的com.test包里

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。