Java 如何获得唯一的JVM标识符?

Java 如何获得唯一的JVM标识符?,java,jvm,Java,Jvm,Java代码如何为运行它的JVM获取唯一标识符?在Unix系统上,我正在寻找的一个例子是JVM正在运行的进程的PID(假设JVM和进程之间存在一对一的映射)。为每个JVM创建唯一ID的一个简单方法是启动一个静态ServerSocket,设置为使用端口0,在该端口上它将获取任何空闲端口。由于同一端口上不能存在两个ServerSocket(JVM或其他),因此它们都是唯一的,您可以查询端口号。因为它是静态的,所以每个JVM只有一个 这确实取决于您拥有什么权限,但在大多数情况下,它工作得很好,您可以始

Java代码如何为运行它的JVM获取唯一标识符?在Unix系统上,我正在寻找的一个例子是JVM正在运行的进程的PID(假设JVM和进程之间存在一对一的映射)。

为每个JVM创建唯一ID的一个简单方法是启动一个静态ServerSocket,设置为使用端口0,在该端口上它将获取任何空闲端口。由于同一端口上不能存在两个ServerSocket(JVM或其他),因此它们都是唯一的,您可以查询端口号。因为它是静态的,所以每个JVM只有一个

这确实取决于您拥有什么权限,但在大多数情况下,它工作得很好,您可以始终将其绑定到“127.0.0.1”,以减少遇到任何限制的可能性

static ServerSocket myssock;
static int myid;

static {
    myssock = new ServerSocket(0);
    myid = myssock.getLocalPort();
}
如果您在多台主机上有多个JVM,那么您可以将上述内容与机器的LAN IP结合起来,在网络上创建一个唯一的JVM ID。

我们一直在使用:

import java.lang.management.ManagementFactory;
String jvmName = ManagementFactory.getRuntimeMXBean().getName();

它给出了类似<<代码> @ /代码>,至少在Sun/Oracle JVMS中。

< P>基本上,当你认为JVM可能分布在多个主机、LAN或可以用于DOCKER容器中时,基本上都落到它的屁股上。p> 如果有重复项可能会花费严重的$$$,您可能希望避免这种情况。然而,如果你想知道这有多大的可能性,就要考虑生日悖论背后的数学。由于随机UUID的密钥空间为2^122,并且假设您有一百万个JVM,因此发生冲突的概率大约为1e-22

有关从当前Java进程获取进程ID的更多信息,请参阅。也有一些好的信息。