Jak znaleźć wersję JVM z programu?


116

Chcę napisać przykładowy plik Java, w którym chcę poznać wersję maszyny JVM, w której działa klasa. Czy jest jakiś sposób?


3
kilka uwag. Właściwości systemu są do tego przeznaczone, ale NALEŻY pamiętać, że jest to operacja uprzywilejowana i aplety / webstart / sand box nie będą w stanie jej wykonać (otrzymując SecurityException). Zwykle chciałbyś uruchomić to w podobny sposóbAccessController.doPrivileged(new PrivilegedAction<String>(...));
bestsss

3
@bestsss Podczas gdy niektóre właściwości są dostępne tylko dla apletów, które są zaufane: java.specification.version, java.versioni java.vm.versionsą dostępne do apletu piasku-box, albo przynajmniej były jak z 1.6.0_23. Zobacz moją odpowiedź, aby uzyskać więcej informacji.
Andrew Thompson,

I coś, co może zadziałać: java -version:)
badp

Odpowiedzi:


127

System.getProperty("java.version") zwraca to, czego potrzebujesz.

Możesz także użyć JMX, jeśli chcesz:

ManagementFactory.getRuntimeMXBean().getVmVersion()


6
To wywołanie JMX zwraca odpowiednik „java.vm.version”, a nie „java.version”. Są to zazwyczaj (ale niekoniecznie) to samo.
Alex Miller

2
ManagementFactory.getRuntimeMXBean (). GetSpecVersion () może być dokładniejsze.
ciocia

Kiedy się różnią, @AlexMiller? Które brzmi interesująco.
DavidS,

1
Właściwie powiedziałbym, że to nie to samo. Wersja java.vm.version to numer wersji jvm, na przykład „25.0-b70”, podczas gdy java.version to normalna wersja języka java, z której zwykle korzystasz „1.8.0”.
Alex Miller,

3
Warto zauważyć, że Java 9 zmieni wartość zwracaną z tego ciągu.
AlBlue

54

Wygląda na java.specification.versionto, że jest najlepszy do tego zadania.

NA PRZYKŁAD

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

1
java.vm.versionma wartość null w openjdk-11-headless
User8461

@ User8461 Może powinieneś zgłosić błąd każdemu, kto nadzoruje otwarty JDK. Szczerze mówiąc, nie widziałem sensu, aby dowiedzieć się o tej wartości. Tutaj jest obecnie 25.45-b02.. co dla mnie nic nie znaczy (nie dostarcza żadnych przydatnych informacji).
Andrew Thompson,

53

Posługiwać się:

System.getProperty("java.version");

Gdzie java.versionmożna zastąpić jedną z wielu innych właściwości systemowych związanych z bieżącą wersją Java. Oto ich tabela:

 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

Źródła:

  • Dane wyjściowe java -XshowSettings:all -versiondla różnych wersji maszyny JVM.
  • Dokumentacja Java API Reference dla System.getProperties()

12

Po prostu sprawa dzwonienia System.getProperty("java.version").



1

Poniższy kod java zwraca JVMwersje, które są dostępne w Twoim obecnym 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) {
                  // ...
              }

wynik:

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

1

W zależności od potrzeb, inne odpowiedzi mogą pomóc.

W moim przypadku nie. Szukałem informacji o „w pełni kwalifikowanej” wersji pakietu IBM JDK.

Tak więc „prawdziwa” odpowiedź może brzmieć: po prostu zrzuć wszystkie właściwości systemu i sprawdź, czy jest taki, który daje ci to, czego szukasz.

W moim przypadku; Odkryłem, że IBM JDK zna plik

Właściwość: java.fullversion

JRE 1.8.0 IBM J9 2.8 Linux amd64-64 Skompresowane referencje 20161013_322271 (włączony JIT, włączony 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


1

Po prostu zadzwoń,

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

Przykładowe dane wyjściowe:

9
9+176


0

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

Java 32-bitowa i 64-bitowa kontrola

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

Wynik :

6
32
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.