動機
定期的なバージョンアップはしないと...というのと、
Java11以上への更新はどうやら魅力的なパワーアップが多いようだった。(もちろんバージョンアップは毎回魅力的だけどね!)
Java 11 に移行する理由 - Azure | Microsoft Docs
環境
- アプリケーションはScalaを書いてJVMで動かしている。
- Scalaは2.13.1を使っている。
- AdoptOpenJDKを利用している。
- 今回アップデートしたいのはアプリケーションランタイムのバージョン。
ScalaとJVMバージョンの組み合わせ確認
まずはここでScalaとJVMのバージョン
https://docs.scala-lang.org/overviews/jdk-compatibility/overview.html
We generally recommend JDK 8 or 11 for /compiling/ Scala code.
とありますが、今回はアプリケーションランタイムのバージョンが目的なのでとくに気にせず。
Scalaのバージョン的には11,12,13, 14 (15もあるが当時はまだ未リリース) で利用ができそうなコトがわかった。
目指すJavaバージョン
巷にはJava8 -> Java11への移行の情報が溢れていたので今回のアップデートではひとまずJava11を目指すことにした。
いろんな記事やブログを読んで回ったが
Java 8 から Java 11 への移行 - Azure | Microsoft Docs
が参考になった。
Scalaを利用しているのでアプリケーションから直接JavaのAPIを利用することは少ないのでほとんどなにもしなくても良かったがいくつか対応があったので以下でピックアップ
GCオプションの確認
下にある通りです。
Java 8 から Java 11 への移行 - Azure | Microsoft Docs
今回アップデートしたアプリケーションはG1GCだとパフォーマンスがParallel GCより劣るような、ヒープサイズとCPU数、アプリケーション特徴の場合は見逃していると性能下がって驚いてしまうので必ず確認しよう。
利用していたライブラリから An illegal reflective access operation has occurred
利用していたライブラリから
An illegal reflective access operation has occurred
が発生してログが出ていた。
私はJavaの起動オプションに--illegal-access*=warn
とつけてwarnログとして残すことにした。
Java 8 から Java 11 への移行 - Azure | Microsoft Docs
Jetty ALPN Agent からの卒業
issueに導かれ以下の記事と出会った。
Jetty, ALPN & Java 8u252 – Webtide
どうやらjetty-alpn-agentはもう指定しなくていいらしい。
もともとhttp/2対応のために jetty-alpn-agentをjava-agentとして利用したが以下アップデートでJava本体で対応がされたため必要なくなった。
JEP 244: TLS Application-Layer Protocol Negotiation Extension
java.securityファイルの位置変更への対応
もともと $JAVA_HOME/jre/lib/security/java.security
もあったファイルがJava11では
$JAVA_HOME/conf/security/java.security
に場所が変更さた。
Java Security Overview
をみるとファイルの位置が書いてある。
最後に
私たちのアプリケーションはScalaから利用していたのと利用しているライブラリで問題がおきなかったので、幸いあまり多くの対応を必要としなかった。
アップデートによりGCの回数が落ち着きを見せたり、Java Flight Recorderの利用やJava 11であることを前提とした便利ツールを利用することが叶った。