2011-11-28 127 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上。