Como encontrar a versão JVM de um programa?

116

Quero escrever um arquivo Java de amostra no qual desejo saber a versão JVM na qual a classe está sendo executada. Há algum jeito?

java_geek
fonte
3
algumas notas. As propriedades do sistema são destinadas a isso, mas tenha em mente que é uma operação privilegiada e applets / webstart / código sand boxed não serão capazes de executá-lo (obtendo SecurityException). Normalmente, você gostaria de executá-lo de maneira semelhanteAccessController.doPrivileged(new PrivilegedAction<String>(...));
bestsss
3
@bestsss Embora algumas propriedades estão disponíveis só para applets que são de confiança: java.specification.version, java.version& java.vm.versionsão todos disponíveis para um applet caixas de areia, ou, pelo menos, eles eram como de 1.6.0_23. Veja minha resposta para mais detalhes.
Andrew Thompson
Também algo que pode funcionar: java -version:)
badp
2
Possível duplicata de Obtendo a versão Java em tempo de execução
BuZZ-dEE

Respostas:

127

System.getProperty("java.version") retorna o que você precisa.

Você também pode usar JMX se desejar:

ManagementFactory.getRuntimeMXBean().getVmVersion()

AlexR
fonte
6
Essa chamada JMX retorna o equivalente a "java.vm.version", não "java.version". Geralmente (mas não necessariamente) são iguais.
Alex Miller
2
ManagementFactory.getRuntimeMXBean (). GetSpecVersion () pode ser mais preciso.
até
Quando eles são diferentes, @AlexMiller? Isso parece interessante.
DavidS
1
Na verdade, eu diria que eles não são iguais. O java.vm.version é o número da versão jvm, algo como "25.0-b70", enquanto o java.version é a versão normal da linguagem java que você está acostumado a ver "1.8.0".
Alex Miller
3
Vale a pena notar que o Java 9 irá alterar o valor retornado desta string.
AlBlue de
54

Parece que java.specification.versioné o melhor para o trabalho.

POR EXEMPLO

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
Andrew Thompson
fonte
1
java.vm.versioné nulo em openjdk-11-headless
User8461
@ User8461 Talvez você deva levantar um relatório de bug com quem supervisiona o JDK aberto. Para ser honesto, não vejo muito sentido em descobrir esse valor. Aqui está atualmente 25.45-b02.. o que não significa nada (não fornece nenhuma informação útil) para mim.
Andrew Thompson
53

Usar:

System.getProperty("java.version");

Onde java.versionpode ser substituído por uma das muitas outras propriedades do sistema relacionadas à versão atual do Java. Aqui está uma tabela deles:

 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

Fontes:

  • Saída java -XshowSettings:all -versionpara uma variedade de versões de JVM.
  • Documentação de referência da API Java para System.getProperties()
Sean Patrick Floyd
fonte
12

Simplesmente um caso de ligação System.getProperty("java.version").

Finbarr
fonte
1

Abaixo o código Java retorna as JVMversões que estão disponíveis em seu IDE atual

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) {
                  // ...
              }

resultado:

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

fonte
1

Dependendo do que se precisa, as outras respostas podem ajudar.

No meu caso, eles não fizeram. Eu estava procurando informações sobre a versão "totalmente qualificada" de um IBM JDK.

Portanto, a resposta "real" pode ser: apenas descarte todas as propriedades do sistema e verifique se há alguma que forneça o que você está procurando.

No meu caso; Descobri que o IBM JDK conhece um

Propriedade: java.fullversion

JRE 1.8.0 IBM J9 2.8 Linux amd64-64 Referências compactadas 20161013_322271 (JIT habilitado, AOT habilitado)

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

GhostCat
fonte
1

Basta ligar,

System.out.println(System.getProperty("java.specification.version"));
System.out.println(System.getProperty("java.runtime.version"));

Saída de exemplo:

9
9+176
snr
fonte
0

System.getProperty ("sun.arch.data.model");

Controle Java de 32 bits e 64 bits

    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);

Resultado :

6
32
umut.bayram
fonte