【问题标题】:How to obtain unique JVM identifier?如何获取唯一的 JVM 标识符?
【发布时间】:2011-11-28 21:33:04
【问题描述】:

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

【问题讨论】:

标签: java jvm


【解决方案1】:

我们一直在使用:

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

这给出了类似<pid>@<hostname> 的东西,至少在 Sun/Oracle JVM 中是这样。

【讨论】:

    【解决方案2】:

    为每个 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。

    【讨论】:

      【解决方案3】:

      基本上,当您考虑到您可能将 JVM 分布在多个主机、LAN 上,或者可以在 docker 容器中使用时,这一切都落空了,您基本上无法从 /dev/random 生成 UUID。

      如果重复可能会花费大量美元,您可能希望避免这种情况。但是,如果您想知道这有多大可能,请考虑生日悖论背后的数学。由于随机 UUID 的密钥空间为 2^122,假设您有一百万个 JVM,那么发生冲突的概率约为 1e-22

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-13
        相关资源
        最近更新 更多