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包里

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

(0)

相关推荐

  • 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

  • 基于JAVA代码 获取手机基本信息(本机号码,SDK版本,系统版本,手机型号)

    老风格,废话不多说了,直接给大家贴java代码了. 代码如下: package com.zzw.getPhoneInfos; import android.app.Activity; import android.content.Context; import android.os.Build; import android.os.Bundle; import android.telephony.TelephonyManager; import android.util.Log; public

  • JAVA如何获取客户端IP地址和MAC地址

    本文介绍了JAVA如何获取客户端IP地址和MAC地址 ,分享给大家,具体如下: 1.获取客户端IP地址 public String getIp(HttpServletRequest request) throws Exception { String ip = request.getHeader("X-Forwarded-For"); if (ip != null) { if (!ip.isEmpty() && !"unKnown".equalsIg

  • java如何获取系统CPU、内存占用

    说明:获取的数据是操作系统整体的资源占用情况,不是当前 java进程占用的资源 1. 获取系统CPU占用情况 : import java.lang.management.ManagementFactory; import com.sun.management.OperatingSystemMXBean; private static OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperati

  • java代码获取jenkins数据,构建历史等信息方式

    本篇文章主要介绍如何获取jenkins构建历史数据等信息,不包含java构建等操作. 1.jenkins所需jar,后续如有缺少可百度自行补齐. <!--jenkins所需jar包开始--> <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <dependency> <groupId>org.apache.httpcomponents</gr

  • java代码获取数据库表里数据的总数操作

    在访问数据库时,特别是新手,可能会需要查询表中数据总数,以下这段代码可以非常简便的获取到数据数目 //先建立数据库连接,执行查询语句 Connection conn = DriverManager.getConnection(URL, USER, PassWord); Statement st=conn.createStatement(); ResultSet rs =st.executeQuery("select count(*) as result from tablename")

  • 利用Java如何获取Mybatis动态生成的sql接口实现

    目录 前言 1.编写xml: SqlGenarate.mapper.xml 2.定义接口 3.实现接口 总结 前言 如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号.利用动态 SQL 这一特性可以彻底摆脱这种痛苦.通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中. 目的:利

  • Java如何获取@TableField,@TableName注解的值

    目录 如何获取@TableField,@TableName注解的值 操作方式 小结一下 @TableName和@TableId爆红 加入pom依赖 如何获取@TableField,@TableName注解的值 总觉得写博客要形成自己的风格才行,不能像记流水账一样记录,比如文章有开头,过程,结尾,总结.虽说文章的好坏,跟排版无关,但是至少看得人看的舒服.所以说,要有自己的风格.比如,文章是为了记录什么,解决什么,学到了什么,总结之后给别人帮助.这才是挺有意思的一件事. 不多说,上菜. 有这么一个需

  • Java实现获取Excel中的表单控件

    目录 引入jar包 代码示例 Excel中可通过[开发工具]菜单栏下插入表单控件,如文本框.单选按钮.复选框.组合框等等,插入后的控件可执行设置控件格式,如大小.是否锁定.位置.可选文字.数据源区域.单元格链接等.当Excel中已插入上述控件,需要读取时,也可以使用本文中的方法来读取.下面,将通过Java代码示例展示如何来获取Excel文档中的表单控件.以下是读取的方法及步骤,供参考. 引入jar包 按照如下方法来引用Spire.Xls.jar 版本:5.1.0 方法1 将 Free Spire

  • Java实现获取内网的所有IP地址

    目录 题目描述 代码详解 效果展示 题目描述 在进行网络编程时,有时需要对局域网的所有主机进行遍历,为此需要获得内网的所以IP地址 题目实现:获得内网的所有IP地址的小应用. 解题思路 创建一个类:GainAlllpFrame,继承JFrame窗体类 定义一个gainAlllp()方法:用于获得所有IP,并显示在文本域中的方法 定义一个内部类Pinglp Thread,且是线程类.用于判断给定IP是否为内网IP的线程对象 线程类的执行逻辑是对指定的IP进行ping 访问 获得本机的IP地址和网段

随机推荐