如何从程序中找到 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.versionjava.versionjava.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() &gt;= 11)。

【讨论】:

不幸的是我找不到一个好的常量字段列表,所以我们不能写Runtime.version(). compareToIgnoreOptional(Something.V11)或类似的。一种解决方法是使用Runtime.Version.parse("11")

以上是关于如何从程序中找到 JVM 版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何从命令行获取设备的 iOS 版本?

如何从 Maven 存储库中找到最新版本的工件

如何在 Spring applicationContext.xml 中读取 JVM 参数

如何从命令行获取 nvidia 驱动程序版本?

JVM 原理

jvm是如何实现的