O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

まだまだ進化するJVM!(J Lang Fest Kansai Online #1 講演資料)

まだまだ進化するJVM!
(J Lang Fest Kansai Online #1 講演資料)

2020年10月4日
株式会社NTTデータ 技術開発本部
阪田 浩一

  • Entre para ver os comentários

まだまだ進化するJVM!(J Lang Fest Kansai Online #1 講演資料)

  1. 1. © 2020 NTT DATA Corporation まだまだ進化するJVM! 2020年10月4日 J Lang Fest Kansai Online #1 株式会社NTTデータ 技術開発本部 阪田 浩一
  2. 2. © 2020 NTT DATA Corporation 2 自己紹介 • 阪田 浩一(さかた -) • 通称 じゅくちょー • JVMになりたい人 • NTTデータでJava/OpenJDK + GraalVM の研究開発とそのサポート業に従事しています • Javaチャンピオン • OpenJDK Author jyukutyo
  3. 3. © 2020 NTT DATA Corporation 3 JVMは 25年間にわたり 進化してきた
  4. 4. © 2020 NTT DATA Corporation 4 これまでのJVMの進化 • Javaは遅い、おもちゃだ(という初期の評価) • 大きな機能にも多くの変更があった • JITコンパイル • そもそも最初はJITコンパイルがなかった • -client/-server から階層型コンパイルへ • GCアルゴリズム • CMSに至っては1.4で追加され、14で削除された • 最近でもShenandoah、ZGCを追加した • バイトコード命令の数は1つしか増えていない • invokedynamic
  5. 5. © 2020 NTT DATA Corporation 5 Javaの研究ロードマップ Java 15 リリース 現在 近い未来 • Project Valhalla • Inline Typesで バイトコードも追加 • Project Loom • 仮想スレッドを追加 • Project Panama • JVMとネイティブコード の相互運用改善 さらに未来 ???
  6. 6. © 2020 NTT DATA Corporation 6 JVMを 再実装する! (ランタイムの重要な部分中心)
  7. 7. © 2020 NTT DATA Corporation 7 それが Project Metropolis OpenJDK: Metropolis https://openjdk.java.net/projects/metropolis/
  8. 8. © 2020 NTT DATA Corporation 8 再実装とは? C++の既存実装 ↓ Javaで再実装
  9. 9. © 2020 NTT DATA Corporation 9 Java on Java
  10. 10. © 2020 NTT DATA Corporation 10 Javaで再実装するメリット 1. JVM自体の最適化をより詳細にコントロールできる 2. 他言語を使わない、Javaのみであることで 他言語自体の変更の影響を受けずに済む • C++自体も新バージョンが当然出る 3. OpenJDK開発者の労力削減と門戸を広げられる • スキルとしてJavaとC++の両方が必要だった 4. 新ハードウェア対応や新バイトコード導入といった機能追加の 速度を向上できる Call for Discussion: New Project: Metropolis https://cr.openjdk.java.net/~jrose/metropolis/Metropolis-Proposal.html
  11. 11. © 2020 NTT DATA Corporation 11 リスクが大きい? • 前提:インキュベーションプロジェクトである 1. Javaとなることで、JVM起動のパフォーマンスが悪くなるリスク 2. そのJavaコードへのGCやJITコンパイルの動作が、 アプリケーションの実行に影響するリスク 3. 現在のJavaにはC++にある高密度のデータ構造が ないことによるパフォーマンスのリスク • 例:配列のメモリレイアウト 4. 実装を変更することで品質とパフォーマンスの低下リスク Call for Discussion: New Project: Metropolis https://cr.openjdk.java.net/~jrose/metropolis/Metropolis-Proposal.html
  12. 12. © 2020 NTT DATA Corporation 12 とはいえすでに Java on Javaで 作られた部分があります
  13. 13. © 2020 NTT DATA Corporation 13 どの部分だと 思いますか??
  14. 14. © 2020 NTT DATA Corporation 14 答え: JITコンパイラ
  15. 15. © 2020 NTT DATA Corporation 15 GraalVMの JITコンパイラ
  16. 16. © 2020 NTT DATA Corporation 16 HotSpotで動作する Java実装のJITコンパイラを 作ったことが Graal(VM)のスタート
  17. 17. © 2020 NTT DATA Corporation 17 GraalVMとHotSpot VM • GraalVMはHotSpot VMがベース HotSpot VM Compiler Interface C2C1 HotSpot VM C++ GraalVM Compiler Interface GraalC1 HotSpot VM JVMCI Java
  18. 18. © 2020 NTT DATA Corporation 18 GraalVMとの関係性 • GraalVM • Oracle Labsが開発した Java製JITコンパイラがベース • GraalVM JITコンパイラ(graal) • OpenJDKにもそのJITコンパイラがポートされている • JEP 317: Experimental Java-Based JIT Compiler • -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler で実際にC2コンパイラと入れ替えて使えます みんなのJava OpenJDKから始まる大変革期! https://gihyo.jp/book/2020/978-4-297-11199-1
  19. 19. © 2020 NTT DATA Corporation 19 GraalVMとの関係性 • GraalVMのネイティブイメージ生成機能 • クラスファイルから実行ファイルを生成し、 JVMを利用せずにアプリケーションを実行可能とする
  20. 20. © 2020 NTT DATA Corporation 20 GraalVMのネイティブイメージ機能 • AOT(Ahead-of-Time:事前)コンパイル 「実行前」に 機械語へコンパイル!
  21. 21. © 2020 NTT DATA Corporation 21 JITコンパイル 「実行中」に 機械語へコンパイル! JVM
  22. 22. © 2020 NTT DATA Corporation 22 超簡略化して考えると… ❌ 「実行中」に 機械語へコンパイル! 「実行前」に 機械語へコンパイル!
  23. 23. © 2020 NTT DATA Corporation 23 同じようなことを やっているように 見えませんか?
  24. 24. © 2020 NTT DATA Corporation 24 (追加スライド) 2つのコンパイラの処理は 重なる部分があったため、 このJITコンパイラを元にして ネイティブイメージ生成機能を 作ることができた
  25. 25. © 2020 NTT DATA Corporation 25 JITコンパイラが Javaで書かれていると
  26. 26. © 2020 NTT DATA Corporation 26 JITコンパイラの Javaコードも JITコンパイルする 必要がある
  27. 27. © 2020 NTT DATA Corporation 27 つまり アプリケーション起動時に その分の時間がかかる
  28. 28. © 2020 NTT DATA Corporation 28 JITコンパイラの コードをAOTコンパイル (ネイティブコンパイル) してしまえば ある程度解決できる
  29. 29. © 2020 NTT DATA Corporation 29 JITコンパイラコードのコンパイル JavaでJITコンパイラを書く ↓ そうなるとJITコンパイラのJavaコードを JITコンパイルすることが必要 ↓ あらかじめJITコンパイラのJavaコードを ネイティブコンパイルしておく (libgraal/libjvmcicompiler)
  30. 30. © 2020 NTT DATA Corporation 30 次にJavaに置き換える ものも同じようにする
  31. 31. © 2020 NTT DATA Corporation 31 JVMとGraalVMは 互いに影響を 及ぼし合っている
  32. 32. © 2020 NTT DATA Corporation 32 ネイティブコンパイルを採用するトレードオフ • 事前にコンパイルしたものを使うので、 利用できない機能が出てくる • コードのinstrumentation • 動的な再最適化 • 性能のトレードオフ https://twitter.com/thomaswue/status/1145603781108928513
  33. 33. © 2020 NTT DATA Corporation 33 Project Metropolisの現在 • 現在:Java 15ベースのEAビルドがある • https://jdk.java.net/metropolis/ • GraalVM JITコンパイラがデフォルトコンパイラ • ネイティブコンパイル済み • 次にどのコンポーネントがJava on Javaとなるのかは明らかでない • たとえばGCは難しいだろうと言われている
  34. 34. © 2020 NTT DATA Corporation 34 今後想定される前提作業 • Java on Javaするにはその機能のコンポーネントの JVM内でインタフェースを定義、整備する • 例:JITコンパイラの場合 • JEP 243: Java-Level JVM Compiler Interface
  35. 35. © 2020 NTT DATA Corporation 35 まとめ • Project Metropolis • Java on JavaでJVMを再実装していく! • GraalVM JITコンパイラを足がかりにしていく!
  36. 36. © 2020 NTT DATA Corporation本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です

×