Maison  >  Article  >  Java  >  Comment Java obtient-il l'ID de processus actuel et les ID de processus de tous les processus Java

Comment Java obtient-il l'ID de processus actuel et les ID de processus de tous les processus Java

黄舟
黄舟original
2017-06-04 09:18:423127parcourir

Cet article présente principalement comment Java obtient l'ID de processus actuel et l'ID de processus de tous les processus Java. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

La première consiste à obtenir le Java en cours d'exécution. ID de processus Java, ceci est courant sur Internet, c'est-à-dire que le programme Java lui-même imprime l'ID de processus :

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(); 
  } 

}

Résultats d'exécution :

2896@PC-20150603VRPL
2896

ManagementFactory est une gestion d'exécution Et la classe d'usine pour surveiller les VM Java, elle peut fournir de nombreuses interfaces statiques pour la gestion des VM, qui sont meilleures que RuntimeMXBean

RuntimeMXBean est l'interface de gestion d'exécution de ; Machine virtuelle Java

L'ID de processus actuel est 2896.

Mais cette façon de laisser le processus Java imprimer l'ID par lui-même n'est pas facile à utiliser, car nous avons souvent besoin de connaître le processus Java en cours d'exécution sans modifier le code d'un autre programme Java, si vous le souhaitez également. avez ce besoin, vous pouvez jeter un oeil à la solution suivante :

Obtenir tous les processus Java en cours d'exécution

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);
     }
   }
}

Résultats en cours d'exécution :

2752 ------> 
5172 ------> com.test.Target
5308 ------> com.test.ProcessID

De cette façon, vous pouvez trouver le numéro de processus en fonction du nom de la classe.

MonitoredHost et d'autres classes se trouvent dans ${JAVA_HOME}/lib/tools.jar

Ce qui suit est une méthode qui peut trouver directement l'ID de processus Java correspondant en fonction de la classe :

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;
  }
}

Résultat d'exécution :

PID : 5172

Le code source se trouve dans le package com.test de mon projet hub Git aoptraceur

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn