JJUG CCC 2018 - Autumn
アンカンファレンス - 非同期分散、CQRS、イベントソーシング、DDD
- アトミックとなるように厳密にやるよりは、1か0ではなく、中間状態を許容するアーキテクチャとしたほうがスケールする
Migration Guide from Java8 to Java11
資料: https://www.slideshare.net/mobile/YujiKubota/migration-guide-from-java-8-to-java-11-jjug
JDK10の互換性リスト: http://git.io/jdk10
JDK11の互換性リスト: http://git.io/jdk11
マイグレーションの障壁
ソースコード、バイナリ、動作それぞれの互換性が担保されるようにしているが、互換性が保たれないこともある。
非互換性のポリシー
非互換性の追い方
普通はRelease Notesを読めばいいが、載ってないものもあるので、CSRも読んでいるとのこと。
- Issue Tracker
- JEP
- Compatibility & Specification Release
- Release Notes
- Source Repository
モジュール化を今回説明しないわけ
- クラスパスとモジュールパスの説明をすると時間が足りないため
- Moduleグラフを理解するまではModule化をするには危険。
Java11化について
- メリット
- VMのパフォーマンスが上がる
- G1GCのGCがパラレル化される
- デメリット
- サポートライセンスを考慮しなければならない
- バイナリの非互換性
対処内容
- 実行時例外
- 完全に削除されたオプションの中で、ログGCの移行が特に気をつけないといけない
- 動作不整合、パフォーマンス
java.home がアプリケーション側で変更できなくなる
リフレクション
基本的には使えないように禁止されている。 ただ、オプションを使えば使える。
Java8, Java9以降の両方を対応するライブラリの開発者は、例外を検知した上でリフレクションでインスタンスを
生成するような実装方法になるとのこと。
Learn JDK11 with JShell
資料: https://qiita.com/nowokay/items/80e8ccd50f6749846dd6
GCを発生させないJVMとコーディングパターン
GCの問題
- アプリケーションの実行が止まる
- 割り当てられたCPU時間が減る
- チューニングが大変
- 最適解を見つけるのが難しい
- 環境が変わるとやりなおし
- 見積もりができない
- 問題の対処方法としては、以下の選択肢がある
- あきらめる
- アプリケーションで頑張る
- GCで頑張る
- コンパイラで頑張る
アプリケーションによる対処
コンパイラによる対処
メモリアロケーション量とGC頻度。JVMを変えると、GCの実行され方が変わる。
また、プログラムの書き方も変えると、GCの実行されるタイミングが変わる
- GCチューニングする前に、まずはクエリやアプリケーションのパフォーマンスチューニングを行うとよい