ホームページ  >  記事  >  Java  >  Java はどのようにして現在のプロセス ID とすべての Java プロセスのプロセス ID を取得しますか

Java はどのようにして現在のプロセス ID とすべての Java プロセスのプロセス ID を取得しますか

黄舟
黄舟オリジナル
2017-06-04 09:18:423127ブラウズ

この記事では、Java が現在のプロセス ID とすべての Java プロセスのプロセス ID を取得する方法を主に紹介します。これには特定の参照値があります。興味のある方は参照してください。

1 つ目は、現在実行中の 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 を管理および監視するファクトリ クラスです。多くの static を提供できます。 Interface、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パッケージ

以上がJava はどのようにして現在のプロセス ID とすべての Java プロセスのプロセス ID を取得しますかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。