如何获得我的Java进程的id ?
我知道有一些平台相关的黑客,但我更喜欢一个更通用的解决方案。
如何获得我的Java进程的id ?
我知道有一些平台相关的黑客,但我更喜欢一个更通用的解决方案。
当前回答
为完整起见,Spring Boot中有一个用于
String jvmName = ManagementFactory.getRuntimeMXBean().getName();
return jvmName.split("@")[0];
解决方案。如果需要一个整数,那么可以将其总结为一行代码:
int pid = Integer.parseInt(ManagementFactory.getRuntimeMXBean().getName().split("@")[0]);
如果有人已经使用了Spring引导,她/他可能会使用org.springframework.boot.ApplicationPid
ApplicationPid pid = new ApplicationPid();
pid.toString();
toString()方法输出pid或'?? '。
使用ManagementFactory的注意事项已经在其他回答中讨论过了。
其他回答
我最新发现的是有一个系统属性叫做sun.java.launcher.pid,至少在linux上是可用的。我的计划是使用它,如果没有发现它使用JMX bean。
您可以使用JNA。不幸的是,目前还没有通用的JNA API来获取当前的进程ID,但每个平台都非常简单:
窗户
确保你有jna-platform.jar然后:
int pid = Kernel32.INSTANCE.GetCurrentProcessId();
Unix
声明:
private interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class);
int getpid ();
}
然后:
int pid = CLibrary.INSTANCE.getpid();
Java 9
在Java 9中,新的进程API可用于获取当前进程ID。首先获取当前进程的句柄,然后查询PID:
long pid = ProcessHandle.current().pid();
下面是一个后门方法,它可能不适用于所有的虚拟机,但应该适用于linux和windows(原始示例):
java.lang.management.RuntimeMXBean runtime =
java.lang.management.ManagementFactory.getRuntimeMXBean();
java.lang.reflect.Field jvm = runtime.getClass().getDeclaredField("jvm");
jvm.setAccessible(true);
sun.management.VMManagement mgmt =
(sun.management.VMManagement) jvm.get(runtime);
java.lang.reflect.Method pid_method =
mgmt.getClass().getDeclaredMethod("getProcessId");
pid_method.setAccessible(true);
int pid = (Integer) pid_method.invoke(mgmt);
我知道这是一个旧线程,但我想要调用用于获取PID的API(以及在运行时对Java进程的其他操作)正在添加到JDK 9中的process类:http://openjdk.java.net/jeps/102
不存在能够保证在所有jvm实现中工作的与平台无关的方法。 ManagementFactory.getRuntimeMXBean(). getname()看起来是最好的(最接近的)解决方案,通常包括PID。它很简短,并且可能适用于广泛使用的每个实现。
在linux+windows上,它返回一个类似“12345@hostname”的值(12345是进程id)。不过要注意的是,根据文档,这个值并没有保证:
返回表示正在运行的Java虚拟机的名称。的 返回的名称字符串可以是任意字符串和Java虚拟 机器实现可以选择嵌入有用的特定平台 返回的名称字符串中的信息。每个运行中的虚拟机 可能有不同的名字。
在Java 9中,可以使用新的进程API:
long pid = ProcessHandle.current().pid();