Nach der Übernahme von AdoptOpenJDK durch Eclipse gab es aus Lizenzgründen keine Java-Binaries mit openj9-JVM mehr. Wie auch andere User setzte auch ich diese JVM ein, aufgrund besserer Performance bzw. geringerem Speicherbedarf, vorallen in Docker-Containern.
Mittlerweile gibt es nun auch wieder offizielle OpenJDK-Builds, direkt von IBM.
Ich setze Eclipse für die Entwicklung und Docker-Container für den Betrieb ein. Mir ist immer wichtig, dass die Java-Version in allen Stages exakt gleich ist: Beim Development, beim Testen, beim Betreiben.
In diesem Blogpost stelle ich vor, wie ich die Version 11.0.13_8-jre
für alle meine Stages einsetze.
Standalone JRE/JDK
Als Standalone JRE bzw. JDK kann Java 11 bei IBM heruntergeladen werden:
https://developer.ibm.com/languages/java/semeru-runtimes/downloads/
$ java -version openjdk version "11.0.13" 2021-10-19 IBM Semeru Runtime Open Edition 11.0.13.0 (build 11.0.13+8) Eclipse OpenJ9 VM 11.0.13.0 (build openj9-0.29.0, JRE 11 Windows 10 amd64-64-Bit Compressed References 20211022_218 (JIT enabled, AOT enabled) OpenJ9 - e1e72c497 OMR - 299b6a2d2 JCL - 2d83aa3b76 based on jdk-11.0.13+8)
Docker-Image
Tags unter: https://hub.docker.com/_/ibm-semeru-runtimes
$ docker pull ibm-semeru-runtimes:open-11.0.13_8-jre
Ausführen des heruntergeladenen Images (mit Befehl java -version
):
$ docker run ibm-semeru-runtimes:open-11.0.13_8-jre java -version openjdk version "11.0.13" 2021-10-19 IBM Semeru Runtime Open Edition 11.0.13.0 (build 11.0.13+8) Eclipse OpenJ9 VM 11.0.13.0 (build openj9-0.29.0, JRE 11 Linux amd64-64-Bit Compressed References 20211022_282 (JIT enabled, AOT enabled) OpenJ9 - e1e72c497 OMR - 299b6a2d2 JCL - 2d83aa3b76 based on jdk-11.0.13+8)
Tomcat-Docker-Image
Leider gibt es beim offiziellen Docker-Hub von Tomcat kein (aktuelles) OpenJ9-Build.
Ich habe mir daher selbst eines erzeugt, abgeleitet von https://github.com/docker-library/tomcat/blob/7dc6e45523f302d0d90b9b5bfef5f179a226f604/10.1/jre11/openjdk-bullseye/Dockerfile
Hier ändere ich in der obersten Befehlszeile die Ableitung vom openjdk-Build …
FROM openjdk:11-jre-bullseye
… hin zu einem ibm-semeru-runtimes-Build:
FROM ibm-semeru-runtimes:open-11.0.13_8-jre
Das Ganze als Dockerfile
speichern, und durch Docker builden lassen:
(Anmerkung: Ich gebe dem Image einen eigenen Namen mittels -t
, damit ich es von den offiziellen Images gut unterscheiden kann.)
docker build -t self_built_tomcat:10.1.0-m8-tomcat_11.0.13_8-jre .
Start des Images:
docker run self_built_tomcat:10.1.0-m8-tomcat_11.0.13_8-jre
Und tatsächlich, der Tomcat startet mit der gewünschten openj9-JVM.
NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED (...) Server version name: Apache Tomcat/10.1.0-M8 (...) Server built: Dec 2 2021 12:56:20 UTC (...) Server version number: 10.1.0.0 (...) OS Name: Linux (...) OS Version: 5.4.0-90-generic (...) Architecture: amd64 (...) Java Home: /opt/java/openjdk (...) JVM Version: 11.0.13+8 (...) JVM Vendor: Eclipse OpenJ9 (...) CATALINA_BASE: /usr/local/tomcat (...) CATALINA_HOME: /usr/local/tomcat
Der Speicherverbrauch der openj9-Version ist auch wesentlich geringer (im Vergleich zur offiziellen Tomcat-Docker-Image-Version mit JRE11)
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 610c90c553fe self_built_tomcat 0.11% 34.96MiB / 1.913GiB 1.78% 0B / 0B 10MB / 8.19kB 25 ff6afa536412 tomcat_jre11-openjdk_bullseye 0.25% 55.42MiB / 1.913GiB 2.83% 0B / 0B 270kB / 0B 18
Fazit
Image Credits: Foto von Igor Haritanovich von Pexels