資料: https://www.slideshare.net/YujiKubota/head-toward-java-13-and-java-14-jjug
5つの機能追加。1378個のバグ修正
* Dynamic CDS Archives
* Class Data Sharing。共通的なクラスや文字列などを複数プロセスで共有する機能。起動時間を短縮できる。後出しできないので異常系を含めてロードする必要あり
* ZGC: Uncommmit Unused Memory
* ZGCが未使用のメモリをアンコミットしてOSに返すようになった。Xmsは下回らないようになっているので、XmxとXmsが等しければ自動的に機能が無効になる。
* Reimplement the Legacy Socket API
* Socket API(java.netSocketやjava.net.ServerSocket) の内部実装が変わった
* Switch Expressions (Preview)
* Switchの戻り値を示すステートメントが break から yield に変わった。
* Text Blocks (Preview)
* ヒアドキュメント。文字列を書いた通りに読み込むことができる。提供されるクラスは @Deprecated が付与されているため、今後変更されたり消される可能性あり。
* Unicode 12.1サポート。
* Java 5時代からていあんされていたBufferのAPIが追加された。
* -Xmsは正確には亜初期サイズであり最小サイズではない
8 + 5個の新機能
\ と空白 \s を柔軟に制御できるように2つのエスケープシーケンスを追加した独自のJDKがどうなっているのか確認してみた
厳密にはメンテナンス期間は確定していない。OpenJDKコミュニティのメーリングリストでメンテナンス終了の通知が行うあれ、メンテナンスを引き継ぐコミュニティなどが現れないとそのまま終了とする。 JDK 9、JDK 10、JDK 12は引き継ぎ先が現れず終了。
JDK部分ではなくJVMのオープン実装。 JDK部分にOpenJDKを利用したバイナリがAdoptOpenJDKコミュニティで配布されている。そのため、JDK部分のメンテナンスは実質AdoptOpenJDK。
Java11は jdk-updates/jdk11u をベースにしていて、メンテナンスはOpenJDKに準じる
Java 11のリポジトリでupstreamでタグうちされたタイミングでmergeしているようだが、squashされてて一見では確認不可能。 mergeもPRでmergeパターンと直接Pushパターンがある。 upstream先が分からん。
Linux Distribution提供のopenjdkパッケージは提供元のパッケージソース。 RPMパッケージであればRPMS(SPEC)を確認。
メンテナンスきかんはOpenJDKコミュニティに準じる
発表資料: https://github.com/mike-neck/practical-exception
ビールの販売を例に、例外がなんなのか、事前条件、事後条件とは何かを伝えた上で何故例外が大事なのかを説明。その後ビール販売を例に具体的な実装例を説明していた。例外伝播、デフォルトコンストラクタを使わない等、例外実装の基本を復習するのによかった。
LINEのKafka運用について。 Kafkaをどのように Kafkaを使うにあたって、Reabilityや汎用的な話について話す。 各システム間のイベントプロパゲーションのハブとして、非同期のバックグラウンド処理として分散キューイングとして使われている。 360Billionのメッセージフローが1日に転送しており、1日550TB、サービス間は60以上。単一のKafkaクラスターであれば世界最大。 Service Level Objective(SLO)について。99.999%のCluster Availability、とあるAPIの99th Percentileは40ms。 SLOの可視化は、オペレーションの自動化について注意している。 SLOの可視化については、APIのレスポンスタイム、エラーレイトを測っているだけでなく、クライアント側のリトライ、フェイルオーバーにかかった時間についても注視しているとのこと。中の処理を具体的な数字を取得している。 Proberというコンポーネントを作って、クライアントから見たクラスターの性能を計測している。SLIのダッシュボードも提供しており、障害の兆候もわかるように。 Writer、Reader、
KafkaのGCの問題が起きた場合、暫定対応と恒久対応の中でも恒久対応を優先することを是としている。 JVMのsafepoint syncの時間が伸びていたこと、 Write System Callが2秒越えしていた。safepointの中から呼ばれていることもわかった。Write System Callはブロックする。 kprobeを利用することで、linux Kernel APIでDelayを加えて再現ができた。 EXT4のジャーナリングがつまると、Writeをしているアプリケーションがブロックされることは分かった。
移行の泥臭い話を聞きたかったけどQuarkus中心だった。
OOMで止まる時に、クラッシュするオプションを使った方が、コアダンプが取れるのでいざという時に役立つのでオススメ
https://www.slideshare.net/tyoshio2002/jjug-ccc-2019-fall-azure-spring-cloud
Microsoft社とPivotal社が提携した
https://remkop.github.io/presentations/20191123/index.html PECOCLIを使えば、バイナリ生成できる。CLIの補完用のスクリプト生成(Bash, Zsh)、出力の文字色対応もJavaのアノテーションで実装可能などJavaエンジニアがコマンド実装するには良さそう。 バイナリということで起動も一瞬。
https://speakerdeck.com/rshindo/jjug-ccc-2019-fall OSSのソースコードの読み方。 taichiさんのやつと読み比べたい。
マイクロサービスとして多数のサーバーを不可にあわせて伸縮することが求められるようになった。
JITとAOTの比較。AOTの方が起動時間が早いがスループットがJITに比べて劣っている。 それを改善にするために、GraalVM EEではJITで収集したプロファイルデータをネイティブイメージで使えるようなるとのこと。
Micronautを利用。
Java8 → Java13の差 AOT、CDSとではあまり差がでなかった。Java 8をJava 13に変えるだけで、それだけでも大分速いとのこと。 Java 12からでDefault CDSで最初からCDSが効いている。
起動時間の比較は資料参照のこと Azul Zingは起動を速くする用途ではない。
起動時間は圧倒的に速い。が、に スループットが悪い。 メモリ使用量はGraalVM JITは大量に食うが、GraalVM AOTは削減されている。
private final static Logger LOGGER とかが必要な時に遅延読み込みされるOpenJDK自体の起動速度もApp CDSが追加されたため、Java 12以降であれば高速に動く。 GraalVM使わなくてもそれなりに対応できる。
GraalVMに初めて触れる人に概要を伝えることが目的。 近年のJava界隈で人気が出てきている。 あらゆる言語をJVM上で実行できるもの。ユニバーサルVM。 あらゆる言語の実行環境となれる能力がある。 JVMでできることはGraalVMでもできる。 Truffle 言語実装用のライブラリ。JavaScript、Ruby等はこれを使ってTruffle Ruby等として実装されている。JavaScript以外はExperimental。 Community版を使えば無料で使える。EEはCEより120-130%近く性能が高い。 Oracle Labsが開発しているため、研究成果として製品が上がっているような背景がある。 EEはOracle Cloudを使えば無償で使える。 パフォーマンスを大幅に低下させることなく言語間で相互呼び出しができることがGraalVMの主の目的。 → コンテナは?
Graal VisualVMもあるため、呼び出し等も確認できる Chrome Dev Toolでのデバッグも可能
JITコンパイラも自分で作れるが、最終的にCPUの呼び出しリファレンスも必要になってくる。
ゴールドマンサックスでオレオレ言語を作っていたが、Truffleベースに移行したとのこと。 自分で作ったオレオレ言語がGraalVMで動く!!
ネイティブイメージ生成の話。Oracle DatabaseにGraalVMを組み込んで複数言語に対応できるようにするプロジェクト内で、起動時間、消費リソースを減らす目的で、社内事情でネイティブイメージ化する必要があった。その出来が良かったため公開されたとのこと。 ネイティブイメージ生成には時間かかるため、そこは注意。 Java om iOS!! iOS上ではJVMは禁止されているが、ネイティブイメージならOK。 どんなアプリケーションでもネイティブイメージでも良いかというとそうではない。 ネイティブイメージが適しているのは起動してすぐに停止するもの、マイクロサービスのようなもの。Micronaut、Springのようなフレームワークも対応しているものもある。
Substrate VM リフレクションもネイティブイメージ生成時に自動で判別できるものもあるが、できないものについては設定ファイル書く必要あり。 GraalVM 19.3からJava 11も対応。年間最後のリリースはLTS。
バイトコード + プロファイル → マシンコード JITもAOTも技術的には似ている。
#ccc_I7
Serverless Java function - OpenJDK 13 Alpine Linuxディストリビューション用のJDKを用意するプロジェクトとして、Portolaというものがある。
https://openjdk.java.net/projects/portola/
コンテナの内部情報可視化としてdiveというツールを使っていた https://github.com/wagoodman/dive