Wie finde ich die JVM-Version aus einem Programm?

116

Ich möchte eine Java-Beispieldatei schreiben, in der ich die JVM-Version kennen möchte, in der die Klasse ausgeführt wird. Gibt es einen Weg?

java_geek
quelle
3
einige Notizen. Die Systemeigenschaften sind dafür gedacht, aber denken Sie daran, dass es sich um eine privilegierte Operation handelt und dass Applets / Webstart / Sandbox-Code sie nicht ausführen kann (SecurityException erhalten). Normalerweise AccessController.doPrivileged(new PrivilegedAction<String>(...));
möchten
3
@bestsss Während einige Eigenschaften nur für vertrauenswürdige Applets verfügbar sind : java.specification.version, java.version& java.vm.versionsind alle für ein Applet mit Sandbox verfügbar , oder zumindest ab 1.6.0_23. Siehe meine Antwort für weitere Details.
Andrew Thompson
Auch eine Sache, die funktionieren kann: java -version:)
Badp
2
Mögliches Duplikat von Java-Version zur Laufzeit
abrufen

Antworten:

127

System.getProperty("java.version") gibt zurück, was Sie brauchen.

Sie können JMX auch verwenden, wenn Sie möchten:

ManagementFactory.getRuntimeMXBean().getVmVersion()

AlexR
quelle
6
Dieser JMX-Aufruf gibt das Äquivalent von "java.vm.version" zurück, nicht "java.version". Diese sind normalerweise (aber nicht unbedingt) gleich.
Alex Miller
2
ManagementFactory.getRuntimeMXBean (). GetSpecVersion () ist möglicherweise genauer.
Tante
Wann sind sie anders, @AlexMiller? Das hört sich interessant an.
DavidS
1
Eigentlich würde ich sagen, dass sie nicht gleich sind. Die java.vm.version ist die jvm-Versionsnummer, etwa "25.0-b70", während die java.version die normale Java-Sprachversion ist, die Sie gewohnt sind, "1.8.0" zu sehen.
Alex Miller
3
Beachten Sie, dass Java 9 den zurückgegebenen Wert dieser Zeichenfolge ändert.
AlBlue
54

Es scheint, dass das java.specification.versiondas beste für den Job ist.

Z.B

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
quelle
1
java.vm.versionist null in openjdk-11-headless
User8461
@ User8461 Vielleicht sollten Sie einen Fehlerbericht mit demjenigen erstellen, der das offene JDK überwacht. Um ehrlich zu sein, habe ich nicht viel Sinn darin gesehen, diesen Wert herauszufinden. Hier ist es aktuell 25.45-b02.. was für mich nichts bedeutet (liefert keine nützlichen Informationen).
Andrew Thompson
53

Verwenden:

System.getProperty("java.version");

Wo java.versionkann durch eine der vielen anderen Systemeigenschaften ersetzt werden, die sich auf die aktuelle Java-Version beziehen. Hier ist eine Tabelle von ihnen:

 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

Quellen:

  • Ausgabe von java -XshowSettings:all -versionfür eine Vielzahl von JVM-Versionen.
  • Java API Referenzdokumentation für System.getProperties()
Sean Patrick Floyd
quelle
12

Einfach ein Fall von Anruf System.getProperty("java.version").

Finbarr
quelle
1

Der folgende Java-Code gibt JVMVersionen zurück, die in Ihrer aktuellen IDE verfügbar sind

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

Ausgabe:

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

quelle
1

Je nachdem, was man braucht, können die anderen Antworten helfen.

In meinem Fall haben sie nicht. Ich suchte nach den "vollqualifizierten" Versionsinformationen eines IBM JDK.

Die "echte" Antwort kann also lauten: Speichern Sie einfach alle Systemeigenschaften und prüfen Sie, ob es eine gibt, die Ihnen das bietet, wonach Sie suchen.

In meinem Fall; Ich fand, dass das IBM JDK a kennt

Eigenschaft: java.fullversion

JRE 1.8.0 IBM J9 2.8 Linux amd64-64 Komprimierte Referenzen 20161013_322271 (JIT aktiviert, AOT aktiviert)

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
quelle
1

Einfach anrufen,

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

Beispielausgabe:

9
9+176
snr
quelle
0

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

Java 32 Bit und 64 Bit Control

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

Ausgabe :

6
32
umut.bayram
quelle