如何从程序中找到 JVM 版本?
Posted
技术标签:
【中文标题】如何从程序中找到 JVM 版本?【英文标题】:How to find the JVM version from a program? 【发布时间】:2011-07-03 10:52:05 【问题描述】:我想编写一个示例 Java 文件,我想在其中了解运行该类的 JVM 版本。有什么办法吗?
【问题讨论】:
几个注释。系统属性是为此而设计的,但请记住这是一个特权操作,applet/webstart/sand 盒装代码将无法执行它(获取 SecurityException)。通常你想以类似的方式运行它AccessController.doPrivileged(new PrivilegedAction<String>(...));
@bestsss 虽然某些属性仅适用于受信任的小程序:java.specification.version
、java.version
和 java.vm.version
都可用于沙盒小程序,或者至少它们是1.6.0_23
。有关详细信息,请参阅my answer。
还有一个可行的方法:java -version
:)
Getting Java version at runtime的可能重复
【参考方案1】:
System.getProperty("java.version")
返回您需要的内容。
如果需要,您也可以使用 JMX:
ManagementFactory.getRuntimeMXBean().getVmVersion()
【讨论】:
该 JMX 调用返回等效于“java.vm.version”,而不是“java.version”。这些通常(但不一定)相同。 ManagementFactory.getRuntimeMXBean().getSpecVersion() 可能更准确。 他们什么时候不同,@AlexMiller?听起来很有趣。 实际上,我会说它们不相同。 java.vm.version 是 jvm 版本号,类似于“25.0-b70”,而 java.version 是您习惯于看到“1.8.0”的普通 Java 语言版本。 值得注意的是,Java 9 将更改此字符串的返回值。【参考方案2】:用途:
System.getProperty("java.version");
其中java.version
可以替换为与当前Java 版本相关的许多其他系统属性之一。这是他们的表格:
Property Value (OpenJDK 12) Value (Oracle JRE 8u201) Value (Sun JRE 5u22) Description
------------------------------- ----------------------------------------- --------------------------------------- ---------------------------------------------------- ---------------------------------------------------------------------------------------------------------------
java.version "12" "1.8.0_201" "1.5.0_22" Java Runtime Environment version, which may be interpreted as a Runtime.Version
java.version.date "2019-03-19" null null Java Runtime Environment version date, in ISO-8601 YYYY-MM-DD format, which may be interpreted as a LocalDate
java.vendor "Oracle Corporation" "Oracle Corporation" "Sun Microsystems Inc." Java Runtime Environment vendor
java.vendor.version null null null Java vendor version
java.vendor.url "https://java.oracle.com/" "http://java.oracle.com/" "http://java.sun.com/" Java vendor URL
java.vendor.url.bug "https://bugreport.java.com/bugreport/" "http://bugreport.sun.com/bugreport/" "http://java.sun.com/cgi-bin/bugreport.cgi" Undocumented
java.specification.name "Java Platform API Specification" "Java Platform API Specification" "Java Platform API Specification" Java Runtime Environment specification name
java.specification.vendor "Oracle Corporation" "Oracle Corporation" "Sun Microsystems Inc." Java Runtime Environment specification vendor
java.specification.version "12" "1.8" "1.5" Java Runtime Environment specification version, whose value is the feature element of the runtime version
java.vm.name "OpenJDK 64-Bit Server VM" "Java HotSpot(TM) 64-Bit Server VM" "Java HotSpot(TM) 64-Bit Server VM" Java Virtual Machine implementation name
java.vm.vendor "Oracle Corporation" "Oracle Corporation" "Sun Microsystems Inc." Java Virtual Machine implementation vendor
java.vm.version "12+33" "25.201-b09" "1.5.0_22-b03" Java Virtual Machine implementation version which may be interpreted as a Runtime.Version
java.vm.info "mixed mode, sharing" "mixed mode" "mixed mode" Undocumented
java.vm.specification.name "Java Virtual Machine Specification" "Java Virtual Machine Specification" "Java Virtual Machine Specification" Java Virtual Machine specification name
java.vm.specification.vendor "Oracle Corporation" "Oracle Corporation" "Sun Microsystems Inc." Java Virtual Machine specification vendor
java.vm.specification.version "12" "1.8" "1.0" Java Virtual Machine specification version, whose value is the feature element of the runtime version
java.runtime.name "OpenJDK Runtime Environment" "Java(TM) SE Runtime Environment" "Java(TM) 2 Runtime Environment, Standard Edition" Undocumented
java.runtime.version "12+33" "1.8.0_201-b09" "1.5.0_22-b03" Undocumented
java.class.version "56.0" "52.0" "49.0" Java class format version number
jdk.debug "release" null null Undocumented
sun.java.launcher "SUN_STANDARD" "SUN_STANDARD" "SUN_STANDARD" Undocumented
sun.management.compiler "HotSpot 64-Bit Tiered Compilers" "HotSpot 64-Bit Tiered Compilers" "HotSpot 64-Bit Server Compiler" Undocumented
来源:
java -XshowSettings:all -version
的输出适用于各种 JVM 版本。
System.getProperties()
的 Java API 参考文档
【讨论】:
【参考方案3】:看来java.specification.version
是最适合这项工作的。
例如
java.specification.version 1.6
java.version 1.6.0_23
java.vm.version 19.0-b09
java.runtime.version 1.6.0_23-b05
【讨论】:
java.vm.version
在 openjdk-11-headless 中为空
@User8461 也许您应该向监督开放 JDK 的人提出错误报告,说实话,我没有看到太多发现该价值的意义。目前这里是25.45-b02
.. 这对我来说毫无意义(没有提供有用的信息)。【参考方案4】:
只需调用System.getProperty("java.version")
.
【讨论】:
【参考方案5】:下面的 java 代码返回 JVM
在您当前的 IDE 中可用的版本
List<VirtualMachineDescriptor> descriptors = VirtualMachine.list();
for (VirtualMachineDescriptor descriptor : descriptors)
System.out.println("Found JVM: " + descriptor.displayName());
try
VirtualMachine vm = VirtualMachine.attach(descriptor);
String version = vm.getSystemProperties().getProperty("java.runtime.version");
System.out.println(" Runtime Version: " + version);
String connectorAddress = vm.getAgentProperties().getProperty("com.sun.management.jmxremote.localConnectorAddress");
if (connectorAddress == null)
connectorAddress = vm.getAgentProperties().getProperty("com.sun.management.jmxremote.localConnectorAddress");
JMXServiceURL url = new JMXServiceURL(connectorAddress);
JMXConnector connector = JMXConnectorFactory.connect(url);
MBeanServerConnection mbs = connector.getMBeanServerConnection();
ObjectName threadName = new ObjectName(ManagementFactory.THREAD_MXBEAN_NAME);
Integer threadCount = (Integer)mbs.getAttribute(threadName, "ThreadCount");
System.out.println(" Thread count: " + threadCount);
catch (Exception e)
// ...
输出:
Found JVM: /home/.../STS IDE/sts-bundle/sts-3.7.2.RELEASE//plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar -os linux -ws gtk -arch x86_64 -showsplash -launcher /home/.../STS IDE/sts-bundle/sts-3.7.2.RELEASE/STS -name STS --launcher.library /home/.../STS IDE/sts-bundle/sts-3.7.2.RELEASE//plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.300.v20150602-1417/eclipse_1612.so -startup /home/.../STS IDE/sts-bundle/sts-3.7.2.RELEASE//plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar --launcher.overrideVmargs -exitdata 1ad000f -product org.springsource.sts.ide -vm /usr/bin/java -vmargs -Dosgi.requiredJavaVersion=1.7 -Xms40m -XX:MaxPermSize=256m -Xverify:none -Xmx1200m -jar /home/.../STS IDE/sts-bundle/sts-3.7.2.RELEASE//plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar
Runtime Version: 1.8.0_91-b14
Found JVM: com.intellij.idea.Main
Runtime Version: 1.8.0_91-b14
Found JVM: Test
Runtime Version: 1.7.0_80-b15
【讨论】:
【参考方案6】:根据一个人的需要,其他答案会有所帮助。
就我而言,他们没有。我正在寻找 IBM JDK 的“完全合格”版本信息。
因此,“真正”的答案可能是:只需转储 所有 系统属性并检查是否有一个可以为您提供所需的内容。
就我而言;我发现IBM JDK知道一个
属性:java.fullversion
JRE 1.8.0 IBM J9 2.8 Linux amd64-64 压缩参考 20161013_322271(启用 JIT,启用 AOT)
J9VM - R28_Java8_SR3_20161013_1635_B322271
JIT - tr.r14.java.green_20161011_125790
GC - R28_Java8_SR3_20161013_1635_B322271_CMPRSS J9CL - 20161013_322271
【讨论】:
【参考方案7】:只需调用,
System.out.println(System.getProperty("java.specification.version"));
System.out.println(System.getProperty("java.runtime.version"));
示例输出:
9
9+176
【讨论】:
【参考方案8】:版本信息存储为System
类的属性。
http://docs.oracle.com/javase/6/docs/api/java/lang/System.html#getProperties%28%29
【讨论】:
【参考方案9】:System.getProperty("sun.arch.data.model");
Java 32 位和 64 位控制
Integer vers = Integer.parseInt(System.getProperty("java.version").split("\\.")[1]);
String bitMode = System.getProperty("sun.arch.data.model").toString();
System.out.println(vers);
System.out.println(bitMode);
输出:
6
32
【讨论】:
【参考方案10】:从 Java 9 开始,我们有了一个新的静态方法:Runtime.version()。
返回的对象有一些有趣的方法,例如 feature() 或 compareToIgnoreOptional() 可能更容易使用(例如 Runtime.version().feature() >= 11
)。
【讨论】:
不幸的是我找不到一个好的常量字段列表,所以我们不能写Runtime.version(). compareToIgnoreOptional(Something.V11)
或类似的。一种解决方法是使用Runtime.Version.parse("11")
。以上是关于如何从程序中找到 JVM 版本?的主要内容,如果未能解决你的问题,请参考以下文章