如何获取JVM所在的物理机器名称?
(物理 = 操作系统, 一直到 vmware...)
从发布者的评论中添加:
我指的是JVM运行所在计算机的名称。很可能是一个物理计算机,但如果JVM在另一个虚拟机中运行,那么该名称也是可以的。
如何获取JVM所在的物理机器名称?
(物理 = 操作系统, 一直到 vmware...)
从发布者的评论中添加:
我指的是JVM运行所在计算机的名称。很可能是一个物理计算机,但如果JVM在另一个虚拟机中运行,那么该名称也是可以的。
String computername=InetAddress.getLocalHost().getHostName();
System.out.println(computername);
在Windows上,如果你想获取工作站名称,可以使用以下代码:
System.getenv("COMPUTERNAME")
以下是几种选项,因为我不确定你想要的是什么:
RuntimeMXBean rmx = ManagementFactory.getRunTimeMXBean();
System.out.println(rmx.getName());
或者...
System.out.println(InetAddress.getLocalHost().getHostName());
或者在Linux上
Runtime r = Runtime.getRuntime();
Process p = r.exec("uname -a");
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream());
System.out.println(r.readLine());
我不确定你所说的“物理机器名称”是什么意思。你的评论“(Physical = OS, up to vmware...)”需要向我解释。
但是,您可以使用System.getProperty(String key),其中key是在此处找到的键之一:http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#getProperties()
这应该会告诉您操作系统名称。如果您需要主机名,请使用jsight的建议。
我认为你无法可靠地找到这样的名称。
根据虚拟化的级别,您可能正在运行裸机、虚拟机、VM内的VM、Docker,甚至是某些云提供商的自定义JVM,这些可能具有额外的抽象级别和云特定的网络API处理。
我最近在处理一个任务,即识别机器以检测某个服务实例何时被卡住。这必须在托管的测试环境和云中的生产环境中都能正常工作。
如果云提供商的API(AWS SDK或Google Cloud Engine API)提供任何内容,我最终使用了特定的云提供商的API,否则使用网络API(请参见@jsight的答案),如果它提供像127.0.0.1或192.*这样的IP,则使用保证在任何JVM实例中只出现一次的对象的hash()
。
所有这些变化可能随时间而改变。目标是在某个给定的时刻唯一地标识节点。如果这是您的最终目标,我希望这可以帮助到您。