如何获取唯一的JVM标识符?

时间:2011-11-28 21:33:05

标签: java jvm

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

3 个答案:

答案 0 :(得分:10)

为每个JVM创建唯一ID的一种简单方法是启动静态ServerSocket,设置为使用端口0,它将获取任何空闲端口。由于在同一端口上不能存在两个ServerSockets(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。

答案 1 :(得分:7)

我们一直在使用:

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

至少在Sun / Oracle JVM中,它提供了<pid>@<hostname>之类的东西。

答案 2 :(得分:0)

基本上,当您考虑将JVM分布在多个主机,LAN上,或者可以在Docker容器中使用时,基本上所有这些事情就从此倒塌了,基本上是从/ dev / random生成UUID。

如果重复操作可能会导致严重的损失,您可能要避免这种情况。但是,如果您想知道这种可能性有多大,可以考虑一下生日悖论背后的数学原理。由于随机UUID的密钥空间为2 ^ 122,并且假设您有100万个JVM,则发生冲突的可能性约为1e-22