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

14

Java代码如何获得所在JVM的唯一标识符?在Unix系统上,我需要的示例是JVM运行进程的PID(假设JVM和进程之间是一对一的映射关系)。


获取当前Java进程的进程ID,请参阅https://dev59.com/t3VD5IYBdhLWcg3wQZUg。此博客文章http://blog.igorminar.com/2007/03/how-java-application-can-discover-its.html也提供了一些有用的信息。 - prunge
3个回答

16

我们一直在使用:

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

这将会得到类似于<pid>@<hostname>的东西, 至少在Sun/Oracle JVM下.


在 Docker 上运行,它总是会返回类似于 "1@localhost" 的东西。 - deFreitas
所以我们需要一个新的机制... - Erik van Oosten
我最后创建了一个带有随机UUID的单例实例变量。 - deFreitas
我最后创建了一个带有随机UUID的单例实例变量。 - undefined

13

创建每个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,则可以将上述内容与计算机的局域网IP相结合,以在网络上创建唯一的JVM ID。


0

基本上,当您考虑到可能在多个主机、局域网或可能在Docker容器中使用JVM时,所有这些都会失败,因此您只能从/dev/random生成UUID。

如果重复可能会造成严重的损失,您可能希望避免这种情况。但是,如果您想知道这有多大可能性,请考虑生日悖论背后的数学原理。由于随机UUID具有2^122的密钥空间,并假设您有一百万个JVM,则碰撞的概率约为1e-22。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接