Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Introduction to Java 11: Support and JVM Features #jjug

4,416 views

Published on

Slide for JJUG Night Seminar 2018/Oct

Published in: Technology
  • Be the first to comment

Introduction to Java 11: Support and JVM Features #jjug

  1. 1. Java11:サポートとVM機能編 KUBOTAYuji(@sugarlife) JJUGNightSeminar2018/Oct
  2. 2. Java11の「サポート」
  3. 3. Disclaimer 解りやすくするためざっくり説明している箇所があります 発表者は5年以上OpenJDKのサポートを担当していた経験上、しば しば商用/本番環境でもOpenJDKを利用している前提で話をします Javaのサポート提供企業のいずれとも関係がなく、各企業のサポー ト内容詳細については各企業に問い合わせください
  4. 4. 本資料でのサポートの定義 開発サポート バグの修正 セキュリティ対応(脆弱性修正) 機能拡張、新機能開発を含まない維持管理開発 配信サポート バイナリの配信・提供 バグ・脆弱性修正を行ったアップデートの配信 一定期間だけ無償なケースもある 問合せサポート SLAが定められている問合せ対応(障害対応、性能問題等) コンサル 企業・団体独自の経験提供
  5. 5. 誰がやってるのか? 開発サポート OpenJDKコミュニティ Java11は現在は3年間の予定 独自Java開発企業・団体(ここではTCKを通ったもの) 配信サポート(一例、Java11に限定) Oracle,AzulSystems(Zulu,Zing),RedHat,IBM AdoptOpenJDK,各Linuxディストリビューション (Debian,Ubuntu,Fedora,Arch,etc) OpenJDKコミュニティは配信していない 問合せサポート バイナリ配信サポートの一部企業、およびその他の企業
  6. 6. 無償で使いたい人向けの結論 AdoptOpenJDKから入手しよう Java11の無償「配信サポート」期間が一番長い(4年間)
  7. 7. 想定問答集 つらつら説明されるよりは自身の問題として捉えると身に入りやすいの でこの形式で説明します
  8. 8. OpenJDKってなに? オープンソース実装のJavaです。http://openjdk.java.net/ 多くの人が使っていたであろうOracleJDKのPublicUpdate(≒無償版)が Java11から提供されないので注目が集まりました コミュニティのリード役はOracleでパッチ投稿数も段違いです。 以前はOracleしかコミットできない部分もありましたが、現在は改善が 進められ、よりオープンなコミュニティへと前進しています
  9. 9. OpenJDKはLTSを提供しないの? 本資料における「開発サポート」であればサポート期間は長い。Java9 や10は半年でしたがJava11は現時点で3年間の予定です。 今後より長くなる可能性もあります。前例としてJava6はOracleがメン テナンスリードを退役してからはRedHatがリードを務めてました。 「配信サポート」や「問合せサポート」は以前からやっておらず、今後 も予定はありません
  10. 10. Oracleから無償なJava入手できないの? できます。 OracleOpenJDKと良く呼ばれるようになったOracle社がビルドした OpenJDKがhttp://jdk.java.netから無償で入手できます。 恐らく他と比較して最速で入手できますが、配信サポートは半年間(※)で す。(※:『オラクルの公式OpenJDKバイナリは6カ月でアップデートを終 了』の項参照) OpenJDKではない方のOracleJDKについては新しいライセンスで公開 されています。ライセンスを読んで利用する必要があります
  11. 11. OpenJDKは商用で利用できる品質なの? DEFINITELYYES. 前例についてはこちらの資料も参考にしてください
  12. 12. OpenJDKに乗り換えるのは簡単なの? 簡単です。 OracleJDKからOpenJDKのマイグレーションはあまり問題は起きにく いですが、証明書周りが若干ネックになるケースもあります。 大半はOpenJDKの実装というよりはライセンス関係の問題です。 なお、Java8からJava11のマイグレーションはOracleJDKでも OpenJDKでも等しく面倒です
  13. 13. AdoptOpenJDKリリース遅れてるけど大丈夫? 大丈夫です。 元々サードパーティのOpenJDKはリリース後にテストなどをするのでマ イナーアップデートでも1‑2週間ぐらいは遅れます。 AdoptOpenJDKもリリース後からビルドやテストを実施してるので遅れ ることは必然です。Java11のリリース状況はここで確認できます。約一 週間ぐらいでリリースされました ちなみにOracleだけがほぼ同時に配信していました。0dayattackリスク を勘案する場合、OracleOpenJDKが選択肢に入ります
  14. 14. JREって無くなったんでしょ? ※JRE:Java開発ツールキットなどを除いたJavaランタイム環境のみに限 定されたパッケージ、インストーラ、バイナリ Windows/MacOSは実質その通り。Linuxディストリビューションの OpenJDKは元々別パッケージで提供されているのでおそらく引き続き提 供される(全部は確認しておらず未リリースもあります) 例: openjdk-11-jre と openjdk-11-jdk (Ubuntu等) 例: java-1.11.0-openjdk と java-1.11.0-openjdk-devel (Fedora,RHEL等) より軽量な java-1.11.0-openjdk-headless もある Javaの実行バイナリサイズを削減する手段はjlinkなどが別に用意されて いるので、コンテナ等ではそちらを利用すると良いでしょう
  15. 15. JavaFXってなくなったんでしょ? いいえ。 正しくはOracleJDK同梱ではなくなりました。OpenJDKは昔から同梱 していません。OpenJDKにも同梱される流れを期待していたら同梱をや めてしまった... OpenJDKコミュニティ内にJavaFXのオープン実装であるOpenJFXのプ ロジェクトがあります。バイナリはこちら(openjfx.io)からダウンロード できます。
  16. 16. Javaって有償になったんでしょ? いいえ。 OracleJDKの「バイナリ配信サポート」が有償になりました。Oracleは この代替として「OracleOpenJDK」を提供しています。
  17. 17. いつまでにJava11に乗り換えるべきか? Java8の「配信サポート」期限が切れる前に乗り換えましょう OracleJDK: 有償:2025/3 無償(PublicUpdate):2019/1(個人向けは2020/12) RHELのOpenJDK:2023/6 AzulSystems: ZuluEnterprise:2026/3 Zing:2025/3 IBMJava:2022/4 参考:次LSTのJava17は2021/9リリース予定
  18. 18. すぐにJava12に乗り換える必要あるんでしょ? ないです。※発表者の個人的観点です 仕事であればOpenJDKの開発サポートが短いバージョンは無視してOK 個人であれば好き好き。私はJava12を使ってます
  19. 19. 何を使うべきか? ※発表者の個人的観点です 基本は予算と要件に合わせて選択する 無償でバイナリ配信サポートなら「AdoptOpenJDK」かLinuxディ ストリビューション提供パッケージ 4年以上のバイナリ配信サポートなら有償サポートを買う クラウド利用者は利用パッケージのサポート内容に依存する
  20. 20. サポート要らなくない? ※発表者の個人的観点です 多くの場合、最低限必要なのは配信サポートです。 無償であればAdoptOpenJDKが4年間のサポート予定なので、次のLTS であり3年後にリリース予定のJava17にマイグレーションする猶予が1年 あります。 有償であれば8年間のサポート提供する企業もあり、より猶予がありま す。 問合せサポートは組織と予算とSLAに依存します。不要であれば不要で しょうし、組織内でエース級を育てるのもアリです。エース級は外にも 余り居ません。 開発サポートはOSSですので誰でも開発に参加できます。組織立って参 加できればそれが最善です。OpenJDKを元に独自JDKを開発する企業も あります
  21. 21. Java11の「VM機能」
  22. 22. JEP330:LaunchSingle‑FileSource‑Code Programs javac でコンパイルして java で実行するのが基本だった スクリプト言語のようにソースコードを直接実行する形式を条件付 きで対応 source‑filemodeと呼ばれる
  23. 23. 単体ファイルの実行 Javaソースファイルを直接 java コマンドで実行する java Hoge.java 制約条件 1つのJavaファイルで完結してる ソース内で最初に出現するトップレベルクラスが main(String[]) を持つ
  24. 24. 良い例 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World."); } } $ docker run --rm -it -v $(pwd)/src:/src openjdk:11-jdk ¥ java /src/Test.java Hello World.
  25. 25. 悪い例 public class Hoge {} public class Fail { public static void main(String[] args) { System.out.println("Fail"); } } $ docker run --rm -it -v $(pwd)/src:/src openjdk:11-jdk ¥ java /src/Fail.java error: can't find main(String[]) method in class: Hoge
  26. 26. スクリプト化 Javaソースをスクリプトのように扱う ./Hoge.java 制約条件 ファイル冒頭に実行するJavaを指定する #!<JAVA_HOMEフルパス>/bin/java --source 11 --source でバージョン指定も必須 それ以外は単体ファイルと一緒
  27. 27. 良い例 #!/usr/lib/jvm/java-11-openjdk-amd64/bin/java --source 11 public class Hoge { public static void main(String[] args) { System.out.println("Hello World by shellbang"); } } $ docker run --rm -it -v $(pwd)/src:/src openjdk:11-jdk ¥ /src/test.sh Hello World by shellbang
  28. 28. どうやってるの? 1.Source‑Launcherクラスが起動 2.source‑filemodeで指定したクラスをコンパイル 3.インメモリに展開 4.クラスローダでロード カスタムクラスローダでロード後アプリケーションクラスロー ダに委譲 つまりアプリケーションクラスパスに含めたクラス群から、指 定したクラスは参照できない 5. main(String[]) を発火
  29. 29. JEP328:FlightRecorder 最高峰のプロファイラ OracleJDK商用機能の一つがオープンソース化
  30. 30. できること ボトルネック調査 GC、同期処理、I/O処理、メソッド毎のCPU時間など 収集可能な情報の例 OS:メモリ、CPU、プロセス情報、nativeライブラリ情報 JVM:起動オプション、GC設定、メソッドプロファイリング、 ヒープメモリ状況 JDKライブラリ:ソケットIO、ファイルIO、エラー情報、モジ ュール情報 柔軟なイベント収集・監視方法 アプリケーション開始から終了までの全情報をダンプ -XX:StartFlightRecording=dumponexit=true カスタムイベントを作成して独自情報を収集 jdk.jfr.Event 等を利用する(OracleJDKでの実装例)
  31. 31. 注意点 FlightRecorderはツールではなくてJVMの情報収集機能 可視化にはJDKMissionControlのバージョン7以降が別に必 要。これは同梱されてない JMCもFlightRecorderと同時にオープンソース化した OracleJDKのオプション構成から変更されているので流用不可
  32. 32. JEP318:Epsilon:ANo‑OpGarbageCollector (Experimental) 何もしないメモリアロケータ -XX:+UseEpsilonGC
  33. 33. No‑OpGC GCは不要メモリを回収するのが仕事ですが、EpsilonGCは通称「no‑op GC」と呼ばれる、メモリ回収を行わないGCです。 Javaアプリケーションに割り当てたヒープサイズを超えて使用しようと した場合ただちにメモリエラー(OutOfMemoryError)になります。
  34. 34. 注意点1 通常はJVMにメモリ管理を任せているため、意図しないメモリフットプ リントの増大や負荷が多少なりとも発生します。EpsilonGCはこの影響 を極力無視できるようにすることを目的としており、プロダクションで はなく主に開発や研究/実験の目的で利用されることを想定していま す。JITとか。 System.gc() も当然動きません。
  35. 35. 注意点2 このGCは限定的に「使える」。ただし、 ヒープとスタックの違い ガベージを生成しないオブジェクトとは何か TLABサイズがパフォーマンスに影響する EpsilonGCはアロケート方法が独自 自分のアプリケーションのライフサイクルとヒープサイズ などを把握した上で使うことが望ましい。なおExperimentalです。
  36. 36. JEP333:ZGC:AScalableLow‑LatencyGarbage Collector(Experimental) PauselessGC -XX:+UseZGC
  37. 37. PauselessGC 今までのGCはヒープサイズやライブセット数に比例して完全停止 時間(Stop‑The‑World,STW)が長くなる問題があった STWをRootScanのみに限定することでこれを解決した GC各処理の徹底的な並列化、他 ColoredPointers等よるロードバリア処理改善 Coloredpointer:マーク状態等を表現 データ構造やページング処理等の工夫も とはいえconcurrentclassunloadingがまだ未実装 世代別GCではない等、従来GCとアルゴリズムが大きく異なる
  38. 38. 注意点1 64bit限定 ColoredPointersが64bit前提です 仮想メモリを利用している CompressedOopsもサポートしてません レイアウトは ZBitField を追いかけてみよう 開発動機的にも32bitサポートは望み薄 Linux限定 シンプルにLinux前提の実装がちょくちょくある 需要があれば他も対応するらしい
  39. 39. 注意点2 現時点ではExperimentalであり、本番/商用で使うべきではないです。使 う場合、 仕様変更の追跡が必要 普通に変更がガンガン入ってる クラスアンローディング周りは確実に(大規模)変更が入る LargePagesやNUMAなどのメモリ効率性に関わる設定や監視も必 要 小さいヒープなら関係ないが、その場合既存GCで良い などを把握した上で使うことが望ましい。
  40. 40. Question? KUBOTAYuji(@sugarlife)

×