openj9 und Java 11: als Standalone JRE/JDK, als Docker-Image und als Tomcat-Docker-Image

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