この記事では、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 サイトの他の関連記事を参照してください。