[JAVA] Probleme und Problemumgehungen, die mit jlink in openjdk eine ungewöhnlich große Laufzeit verursachen

Ich war mit Jib nicht zufrieden und wurde erwischt, als ich versuchte, mit jlink auf der Suche nach einem leichten Container zu spielen. Sobald ich es nachgeschlagen hatte, stellte ich fest, dass "libjvm.so" überwiegend aufgebläht war. Aber wieso?

Wenn Sie Google mit openjdk jlink Größe versuchen, werden Sie verschiedene Dinge sehen.

https://matsumana.info/blog/2018/10/13/openjdk11-docker/ https://qiita.com/h-r-k-matsumoto/items/294eeb838cfd062d75b6

Meistens scheint das debian-basierte openjdk-Paket jlink des folgenden Problems den Fall erreicht zu haben, in dem das Debug-Symbol enthalten ist.

https://github.com/docker-library/openjdk/issues/217

Diesmal ist es im RHEL-System (CentOS 7) passiert, aber ich denke, dass das Gleiche passiert. Betrachtet man die Fälle, in denen das gleiche openjdk mit der alpinen Version vermieden werden kann, scheint es, dass openjdk nicht schlecht ist.

Ich kenne die detaillierte Ursache so nicht, aber ich werde die Prozedur und die Problemumgehung schreiben, um sie zu reproduzieren. (Das Verhalten kann sich mit einem Paketupdate ändern.)

Reproduktionsverfahren (Stand 2/21)

Diesmal auszuführende Umgebung

$ cat /etc/redhat-release
Fedora release 28 (Twenty Eight)

Ich habe es diesmal nicht geschrieben, aber ich habe es in openjdk 11 im yum-Repository von CentOS 7 bestätigt.

Installieren Sie es aus Ihrem Repository und versuchen Sie es

$ sudo dnf install java-9-openjdk-jmods.x86_64 java-11-openjdk-jmods.x86_64

$ export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.2.7-0.fc28.x86_64
$ JAVA_HOME/bin/jlink --compress 2 --module-path "$JAVA_HOME/jmods" --add-modules java.base --output "jre-$(basename $JAVA_HOME)"

$ export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.2.7-0.fc28.x86_64
$ JAVA_HOME/bin/jlink --compress 2 --module-path "$JAVA_HOME/jmods" --add-modules java.base --output "jre-$(basename $JAVA_HOME)"

$ du -hs jre-java-*
613M    jre-java-11-openjdk-11.0.2.7-0.fc28.x86_64
407M    jre-java-9-openjdk-9.0.4.11-6.fc28.x86_64

$ ls -l jre-*/lib/server/libjvm.so
-rw-rw-r--.1 fukasawah fukasawah 624872128 21. Februar 03:48 jre-java-11-openjdk-11.0.2.7-0.fc28.x86_64/lib/server/libjvm.so
-rw-rw-r--.1 fukasawah fukasawah 410593824 21. Februar 03:47 jre-java-9-openjdk-9.0.4.11-6.fc28.x86_64/lib/server/libjvm.so

Problemumgehung: Verwenden Sie die auf jdk.java.net verteilte OpenJDK-Binärdatei

Ich habe aus irgendeinem Grund alles von 9 bis 12 versucht.

$ curl -LO https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz
$ curl -LO https://download.java.net/java/GA/jdk12/32/GPL/openjdk-12_linux-x64_bin.tar.gz
$ curl -LO https://download.java.net/java/GA/jdk9/9.0.4/binaries/openjdk-9.0.4_linux-x64_bin.tar.gz
$ curl -LO https://download.java.net/java/GA/jdk10/10.0.2/19aef61b38124481863b1413dce1855f/13/openjdk-10.0.2_linux-x64_bin.tar.gz

$ tar xzf openjdk-9.0.4_linux-x64_bin.tar.gz
$ tar xzf openjdk-10.0.2_linux-x64_bin.tar.gz
$ tar xzf openjdk-11.0.2_linux-x64_bin.tar.gz
$ tar xzf openjdk-12_linux-x64_bin.tar.gz

$ for dirpath in jdk-9.0.4 jdk-10.0.2 jdk-11.0.2 jdk-12; do
>   export JAVA_HOME=$PWD/$dirpath
>   $JAVA_HOME/bin/jlink --compress 2 --module-path "$JAVA_HOME/jmods" --add-modules java.base --output "jre-$(basename $JAVA_HOME)"
> done

$ du -hs jre-jdk-*
33M     jre-jdk-10.0.2
35M     jre-jdk-11.0.2
36M     jre-jdk-12
32M     jre-jdk-9.0.4

$ ls -l jre-*/lib/server/libjvm.so
-rw-rw-r--.1 fukasawah fukasawah 624872128 21. Februar 03:48 jre-java-11-openjdk-11.0.2.7-0.fc28.x86_64/lib/server/libjvm.so
-rw-rw-r--.1 fukasawah fukasawah 410593824 21. Februar 03:47 jre-java-9-openjdk-9.0.4.11-6.fc28.x86_64/lib/server/libjvm.so
-rw-rw-r--.1 fukasawah fukasawah 21405080 21. Februar 04:12 jre-jdk-10.0.2/lib/server/libjvm.so
-rw-rw-r--.1 fukasawah fukasawah 22812128 21. Februar 04:12 jre-jdk-11.0.2/lib/server/libjvm.so
-rw-rw-r--.1 fukasawah fukasawah 23027240 21. Februar 04:12 jre-jdk-12/lib/server/libjvm.so
-rw-rw-r--.1 fukasawah fukasawah 20352536 21. Februar 04:12 jre-jdk-9.0.4/lib/server/libjvm.so

Es scheint nicht zu passieren. Die Größe unterscheidet sich um eine Ziffer. Ich habe danach gesucht.

(Vorgang nicht bestätigt) Problemumgehung: strip -p --strip-unneded

** Ich habe nicht bestätigt, ob es so funktioniert **

Ich habe versucht, diese Informationen zu sehen. https://github.com/docker-library/openjdk/issues/217#issuecomment-430380403

Verwenden Sie einfach Streifen, um Symbole zu entfernen, die die Ausführung nicht beeinflussen.

$ strip -p --strip-unneeded jre-java-11-openjdk-11.0.2.7-0.fc28.x86_64/lib/server/libjvm.so
$ strip -p --strip-unneeded jre-java-9-openjdk-9.0.4.11-6.fc28.x86_64/lib/server/libjvm.so

$ ls -l jre-*/lib/server/libjvm.so
-rw-rw-r--.1 fukasawah fukasawah 20025552 21. Februar 03:48 jre-java-11-openjdk-11.0.2.7-0.fc28.x86_64/lib/server/libjvm.so
-rw-rw-r--.1 fukasawah fukasawah 16928088 21. Februar 03:47 jre-java-9-openjdk-9.0.4.11-6.fc28.x86_64/lib/server/libjvm.so
-rw-rw-r--.1 fukasawah fukasawah 21405080 21. Februar 04:12 jre-jdk-10.0.2/lib/server/libjvm.so
-rw-rw-r--.1 fukasawah fukasawah 22812128 21. Februar 04:12 jre-jdk-11.0.2/lib/server/libjvm.so
-rw-rw-r--.1 fukasawah fukasawah 23027240 21. Februar 04:12 jre-jdk-12/lib/server/libjvm.so
-rw-rw-r--.1 fukasawah fukasawah 20352536 21. Februar 04:12 jre-jdk-9.0.4/lib/server/libjvm.so

Wenn Sie dies für das Problem libjvm.so tun, können Sie sehen, dass das Problem in Bezug auf die Größe gelöst wurde. Eher klein.

Wenn Sie sich danach den Befehl nm ansehen, wird das Symbol überhaupt nicht gefunden, sodass es schwierig sein sollte, mit gdb usw. auf einer niedrigeren Ebene als JVM zu debuggen. (Auf der anderen Seite bleibt jdk.java.net erhalten, daher sollte gdb usw. verwendbar sein.)

Recommended Posts

Probleme und Problemumgehungen, die mit jlink in openjdk eine ungewöhnlich große Laufzeit verursachen
Erstellen Sie einen Annotator, der Kuromoji mit NLP4J verwendet. [007]
Erstellen Sie eine EC-Site mit Rails5 ④ ~ Kopf- und Fußzeile ~
Vielleicht funktioniert es! Erstellen Sie ein Bild mit Docker und teilen Sie es!
[Rails] Probleme, die mit devise nicht registriert / angemeldet werden können
Einführung in Lightsleep, eine O / R-Zuordnungsbibliothek, die nur mit Java Runtime- und JDBC-Treibern funktioniert