StackOverflow.com上一个普遍的问题是:“ Java程序如何获得自己的进程ID? 与该问题相关的几个答案包括解析ManagementFactory返回的String
。 getRuntimeMXBean() 。 getName() [但是可以提供“任意字符串”],使用ProcessHandle 。 getPid() [ JEP 102 ],使用Java Native Access (JNA),使用系统信息收集和报告程序 (SIGAR),使用JavaSysMon ,使用Java Native Runtime – POSIX ,通过调用Runtime来解析jps (或jcmd )的结果。 getRuntime() 。 exec(String)和其他方法。 JDK 10可能引入了最简单的方法,即通过RuntimeMXBean上的新方法来获取JVM进程的PID。
JDK-8189091 (“ MBean对PID的访问”)引入了RuntimeMXBean方法getPid ()作为JDK 10的默认接口方法 。 该问题将“问题”表示为:“平台MBean不提供任何API来获取正在运行的JVM的进程ID。 一些JMX工具依赖于RuntimeMXBean :: getName的热点实现,该实现返回<pid> @ <主机名>。” 该问题还提供了“解决方案”:“引入了新的API java.lang.management.RuntimeMXBean.getPid
,以便JMX工具可以直接获取进程ID,而不必依赖于实现细节RuntimeMXBean#getName().split("@")[0]
。”
下一个代码清单是一个简单的清单,它演示了如何在RuntimeMXBean
上使用此新的RuntimeMXBean
getPid()
方法。
使用JDK 10的RuntimeMXBean.getPid()
final RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
final long pid = runtime.getPid();
final Console console = System.console();
out.println("Process ID is '" + pid + "' Press <ENTER> to continue.");
console.readLine();
当上面的代码包含在可执行的main(String[])
函数中并且从命令行执行该函数时,输出如下面的屏幕快照所示(该屏幕快照还包括用于验证PID是否正确的单独终端)通过jcmd)。
进程ID的long
,因此无需解析“任意字符串”。 这种方法也不需要第三方库或复杂的代码来确定当前Java进程的标识符。
这篇文章简要介绍了Java应用程序(用JDK 10或更高版本编写)确定自己的基础进程ID的最简单方法。
翻译自: https://www.javacodegeeks.com/2018/02/jdk-10-accessing-java-applications-process-id-java.html