2011-11-28 30 views
9

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

+0

见http://stackoverflow.com/questions/35842/process-id-in-java用于从当前Java进程获得进程ID的详细信息。 [这篇博客](http://blog.igorminar.com/2007/03/how-java-application-can-discover-its.html)也有一些好消息。 – prunge

回答

9

一个简单的方法是启动一个静态的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。

2

我们一直在使用:

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

其中给出像<pid>@<hostname>,至少在太阳/ Oracle的JVM上。