当前位置: 移动技术网 > IT编程>开发语言>Java > Java如何获取当前进程ID以及所有Java进程的进程ID

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

首先是获取当前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包里

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网