Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
© 2020 NTT DATA Corporation
GraalVMを3つの主機能から眺めてみよう
2020年10月22日 Oracle Groundbreakers APAC Virtual Tour 2020
株式会社NTTデータ 技術開...
© 2020 NTT DATA Corporation 2
自己紹介
• 阪田 浩一(さかた -)
• 通称 じゅくちょー
• JVMになりたい人
• NTTデータでJava/OpenJDK + GraalVMの
研究開発とそのサポート業に従事...
© 2020 NTT DATA Corporation 3
このセッションの役割
GraalVMの
真の力に目覚める!
(3つの主機能について、
その開発経緯を踏まえながら
概要を理解する)
© 2020 NTT DATA Corporation 4
真の力…?
GraalVMって、
ネイティブイメージ作って
起動を速くする
ツールじゃないの…??
© 2020 NTT DATA Corporation 5
GraalVMの3つの主機能
1. 新JITコンパイラによるパフォーマンス向上
2. JavaScript、Ruby、Pythonといった
(JVM言語でない)言語を実行可能
3. ア...
© 2020 NTT DATA Corporation 6
結論として
GraalVMは
ネイティブイメージ生成用ツール
ではありません
© 2020 NTT DATA Corporation 7
GraalVMで検索するとネイティブイメージのことばかりなので…
このセッションでは
JITコンパイラと多言語実行に
比重を置きます
© 2020 NTT DATA Corporation
1. 新JITコンパイラ
© 2020 NTT DATA Corporation 9
GraalVM JITコンパイラは
Javaで書かれた
新しいJITコンパイラ
© 2020 NTT DATA Corporation 10
そのJITコンパイラを
HotSpot VM上に搭載
© 2020 NTT DATA Corporation 11
GraalVMとHotSpot VM
• GraalVMはHotSpot VMがベース
HotSpot VM
Compiler Interface
C2C1
HotSpot VM
C...
© 2020 NTT DATA Corporation 12
GraalVMは
JVMの機能を
すべて包含します
© 2020 NTT DATA Corporation 13
既存のJVMにできることは
すべてできます
© 2020 NTT DATA Corporation 14
Oracle Labsが
開発
© 2020 NTT DATA Corporation 15
GraalVMの2つのエディション
https://www.graalvm.org/
© 2020 NTT DATA Corporation 16
GraalVMの2つのエディション
1. Community Edition (CE)
• OSS (クラスパス例外付き GPL v2)
2. Enterprise Edition ...
© 2020 NTT DATA Corporation 17
以降は
CEを前提にします
© 2020 NTT DATA Corporation 18
GraalVM JITコンパイラの
利点は?
© 2020 NTT DATA Corporation 19
アロケーションの多い
アプリケーションには、
GraalVM JITコンパイラが
有効
© 2020 NTT DATA Corporation 20
たとえば
リアクティブストリーム
で構築したものや
© 2020 NTT DATA Corporation 21
Scalaなど
関数型プログラミング
モデルで構築したもの
© 2020 NTT DATA Corporation 22
C2コンパイラより
パフォーマンスが
向上する場合がある
© 2020 NTT DATA Corporation 23
ベンチマーク
https://renaissance.dev/
Higher is better
© 2020 NTT DATA Corporation 24
Twitter社の事例
• OpenJDKベースの独自JDKにGraalVM JITコンパイラを
バックポート
• 2017年ですでに本番環境で活用
• 数千台のサーバ、Scalaア...
© 2020 NTT DATA Corporation 25
GraalVM JITコンパイラの利点
1. Javaで書かれている
• C++で書かれたC2コンパイラは
長年の変更で複雑化
• 新規に開発することで新機能追加、設計改善
• Ja...
© 2020 NTT DATA Corporation 26
参考:OpenJDKにもポートされている(Experimental)
http://openjdk.java.net/jeps/317
© 2020 NTT DATA Corporation 27
GraalVM JITコンパイラの利点
2. このJITコンパイラ向けに作られた
言語実装用フレームワーク Truffle がある
• このライブラリを用いて実装した言語は、
すべて...
© 2020 NTT DATA Corporation
2. 多言語実行環境
© 2020 NTT DATA Corporation 29
GraalVM JITコンパイラの利点
2. このJITコンパイラ向けに作られた
言語実装用フレームワーク Truffle がある
• このライブラリを用いて実装した言語は、
すべて...
© 2020 NTT DATA Corporation 30
サポートする言語
GraalVM バージョン20.1.0時点のもの
言語 プロダクト名 ステータス 対応バージョン
Java - - OpenJDK 8もしくは11から選択
Java...
© 2020 NTT DATA Corporation 31
(なお、Java 11で
Nashornは非推奨に
なりました)
© 2020 NTT DATA Corporation 32
Truffleでの言語実装
HotSpot VM
JVMCI
GraalVM JITコンパイラ
JVM Lang Truffle
LLVMJS R Ruby
C C++
Fortra...
© 2020 NTT DATA Corporation 33
言語実装の仕組み
対象言語の
ASTインタプリタを
Truffle APIを用いて
Javaで実装する
© 2020 NTT DATA Corporation 34
他言語でも高パフォーマンス
対象言語コードのASTと
インタプリタの両方を
JITコンパイラに評価させ
高性能のコードを生成
© 2020 NTT DATA Corporation 35
ゴールドマン・サックス社の事例
• 1990年代初め、独自に言語を開発
• 現在までコードが増え続ける
• 言語自体の運用開発が課題に
© 2020 NTT DATA Corporation 36
ゴールドマン・サックス社の事例
• その言語をTruffleベースに移行
• 他言語との相互呼び出しが可能に
• メトリクス取得やデバッグが容易に
• 実行パフォーマンスが向上
• ...
© 2020 NTT DATA Corporation 37
究極的には
自分で実装した
プログラミング言語を
GraalVMで実行できる
© 2020 NTT DATA Corporation 38
言語実装サンプル
• GraalVMのリポジトリ内
• SimpleLanguage
• https://github.com/graalvm/simplelanguage
• Si...
© 2020 NTT DATA Corporation 39
私もやってみました(古いバージョンでの実装です)
https://github.com/jyukutyo/JVM-Math-Language
© 2020 NTT DATA Corporation 40
サポートする言語
GraalVM バージョン20.1.0時点のもの
言語 プロダクト名 ステータス 対応バージョン
Java - - OpenJDK 8もしくは11から選択
Java...
© 2020 NTT DATA Corporation 41
参考:GraalPythonの検証
• 実プロジェクトでの利用は(まだ)現実的ではない
• C拡張しているライブラリの利用するとエラーが発生する可能性があり、
確実性に不安が残る
•...
© 2020 NTT DATA Corporation 42
デモ(Python3とGraalPythonでのPandasの実行)
© 2020 NTT DATA Corporation 43
Pythonに関しては
やはりまだ
Experimental
© 2020 NTT DATA Corporation 44
単に各言語を
実行できるだけでは
ない
© 2020 NTT DATA Corporation 45
Interoperability
パフォーマンスを大幅に
低下させることなく、
言語間で
相互呼び出しができる
© 2020 NTT DATA Corporation 46
Java <-> Truffle言語
はもちろん
© 2020 NTT DATA Corporation 47
Truffle言語間でも
(Ruby <-> JavaScriptなど)
© 2020 NTT DATA Corporation 48
GraalVMのビジョン
パフォーマンスを
犠牲にせず、
言語間の抽象化をする
© 2020 NTT DATA Corporation 49
あの処理、
別の言語のライブラリを
使うとすぐできるのに…
© 2020 NTT DATA Corporation 50
Javaから先ほどのPandasコードを呼び出す例
© 2020 NTT DATA Corporation 51
開発ツールの
サポートもある
© 2020 NTT DATA Corporation 52
Google Chrome DevToolsでのデバッグ
© 2020 NTT DATA Corporation 53
デモ(Chrome DevToolsでのデバッグ)
© 2020 NTT DATA Corporation 54
Graal VisualVM
© 2020 NTT DATA Corporation
3. ネイティブイメージ生成機能
© 2020 NTT DATA Corporation 56
GraalVMのネイティブイメージ生成
• ネイティブイメージ
(実行可能なバイナリ) を生成する機能
• 生成したイメージ (ファイル) だけで実行可能
• つまり、起動にJVM ...
© 2020 NTT DATA Corporation 57
Oracle Database
• ユーザ定義関数をJavaで作成できる
しかし、
• GraalVM自体をデータベースに組み込めば、
Javaはもちろん、他言語も使える
• 機能の...
© 2020 NTT DATA Corporation 58
Oracle Databaseに
GraalVMを組み込む
© 2020 NTT DATA Corporation 59
Oracle Databaseへ組み込むには
• JVMが課題
• サイズが大きい
• 初期化処理が長い
• メモリ使用量が大きい
• そのままではデータベースでの利用はできない
© 2020 NTT DATA Corporation 60
GraalVM自体を
ネイティブイメージに
する!
© 2020 NTT DATA Corporation 61
ネイティブイメージにすると
• JVMが不要
• サイズが小さく済む
• 起動時間が短くなる
• メモリ使用量が少なくなる
• ただし、同じプラットフォームでしか動作しない
© 2020 NTT DATA Corporation 62
参考:Oracle Database MLE
• MLE: Multilingal Engine
• https://www.oracle.com/technetwork/datab...
© 2020 NTT DATA Corporation 63
こうした経緯で開発した
ネイティブイメージ
生成機能が
GraalVMの機能の1つ
となった
© 2020 NTT DATA Corporation 64
ネイティブイメージの現状
• Experimental
• サポートプラットフォーム
• x86 64ビットシステム
• Linux、macOS、Windows
© 2020 NTT DATA Corporation 65
ネイティブイメージ生成プロセス
アプリケーション
ライブラリ
JDK
SubstrateVM
下記の繰り返し:
解析ポイント
↓
初期化処理実行
↓
ヒープのスナップショット生成
E...
© 2020 NTT DATA Corporation 66
生成時に
初期化処理を実行し、
起動時間を
短縮する
© 2020 NTT DATA Corporation 67
デモ(ネイティブイメージ生成)
© 2020 NTT DATA Corporation 68
ネイティブイメージ対応フレームワーク
• Micronaut
• Quarkus
• Helidon
• Spring Framework, Bootも対応作業中
(現在はExper...
© 2020 NTT DATA Corporation 69
ネイティブイメージのメリットまとめ
• 起動時間が短くなる
• メモリ使用量が少なくなる
• サイズが小さくなる
© 2020 NTT DATA Corporation 70
どんなアプリケーション
でも、
ネイティブイメージに
する方がよいのか?
© 2020 NTT DATA Corporation 71
JITコンパイル (JVM)
と
AOTコンパイル (GraalVM)
© 2020 NTT DATA Corporation 72
GraalVMのネイティブイメージ機能
• AOT(Ahead-of-Time:事前)コンパイル
「実行前」に
機械語へコンパイル!
© 2020 NTT DATA Corporation 73
JITコンパイル
「実行中」に
機械語へコンパイル!
JVM
© 2020 NTT DATA Corporation 74
超簡略化して考えると…
❌
「実行中」に
機械語へコンパイル!
「実行前」に
機械語へコンパイル!
© 2020 NTT DATA Corporation 75
同じようなことを
やっているように
見えませんか?
© 2020 NTT DATA Corporation 76
2つのコンパイラの処理は
重なる部分があるため、
JITコンパイラを元にして
ネイティブイメージ生成機能を
作ることができた
© 2020 NTT DATA Corporation 77
https://openjdk.java.net/jeps/295
© 2020 NTT DATA Corporation 78
ネイティブコンパイルを採用するトレードオフ
• 事前にコンパイルしたものを使うので、
利用できない機能が出てくる
• コードのinstrumentation
• 動的な再最適化
• ...
© 2020 NTT DATA Corporation 79
ネイティブイメージが適切なケース
• FaaS
• 起動してすぐに終了する
• クラウドで実行する
大規模アプリケーション
• リソースを節約し、コストを削減する
© 2020 NTT DATA Corporation 80
GraalVMの2つのモード
• JITモード
• JVMとGraalVM JITコンパイラで
アプリケーションを実行
• AOTモード
• ネイティブイメージを生成し、JVMなしで...
© 2020 NTT DATA Corporation
4. GraalVMとOpenJDK
© 2020 NTT DATA Corporation 82
Project Metropolis
OpenJDK: Metropolis https://openjdk.java.net/projects/metropolis/
© 2020 NTT DATA Corporation 83
JVMを
再実装する!
(ランタイムの重要な部分中心)
© 2020 NTT DATA Corporation 84
再実装とは?
C++の既存実装
↓
Javaで再実装
© 2020 NTT DATA Corporation 85
Project Metropolisの現在
• 現在:Java 15ベースのEAビルドがある
• https://jdk.java.net/metropolis/
• GraalV...
© 2020 NTT DATA Corporation 86
JITコンパイラが
Javaで書かれていると
© 2020 NTT DATA Corporation 87
JITコンパイラの
Javaコードも
JITコンパイルする
必要がある
© 2020 NTT DATA Corporation 88
つまり
アプリケーション起動時に
その分の時間がかかる
© 2020 NTT DATA Corporation 89
JITコンパイラの
コードをAOTコンパイル
(ネイティブコンパイル)
してしまえば
ある程度解決できる
© 2020 NTT DATA Corporation 90
JITコンパイラコードのコンパイル
JavaでJITコンパイラを書く
↓
そうなるとJITコンパイラのJavaコードを
JITコンパイルすることが必要
↓
あらかじめJITコンパイラ...
© 2020 NTT DATA Corporation 91
JVMとGraalVMは
互いに影響を
及ぼし合っている
© 2020 NTT DATA Corporation 92
ただし、互いに
独立した開発
となっている
© 2020 NTT DATA Corporation 93
GraalVMの3つの主機能
1. 新JITコンパイラによるパフォーマンス向上
2. JavaScript、Ruby、Pythonといった
(JVM言語でない)言語を実行可能
3. ...
© 2020 NTT DATA Corporation本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です
Prochain SlideShare
Chargement dans…5
×

GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)

GraalVMを3つの主機能から眺めてみよう
(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)

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

  • Soyez le premier à commenter

GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)

  1. 1. © 2020 NTT DATA Corporation GraalVMを3つの主機能から眺めてみよう 2020年10月22日 Oracle Groundbreakers APAC Virtual Tour 2020 株式会社NTTデータ 技術開発本部 阪田 浩一
  2. 2. © 2020 NTT DATA Corporation 2 自己紹介 • 阪田 浩一(さかた -) • 通称 じゅくちょー • JVMになりたい人 • NTTデータでJava/OpenJDK + GraalVMの 研究開発とそのサポート業に従事しています • OpenJDK Author jyukutyo
  3. 3. © 2020 NTT DATA Corporation 3 このセッションの役割 GraalVMの 真の力に目覚める! (3つの主機能について、 その開発経緯を踏まえながら 概要を理解する)
  4. 4. © 2020 NTT DATA Corporation 4 真の力…? GraalVMって、 ネイティブイメージ作って 起動を速くする ツールじゃないの…??
  5. 5. © 2020 NTT DATA Corporation 5 GraalVMの3つの主機能 1. 新JITコンパイラによるパフォーマンス向上 2. JavaScript、Ruby、Pythonといった (JVM言語でない)言語を実行可能 3. アプリケーションをネイティブイメージにして JVMなしで実行可能 (JVMでの実行時とは異なる特性を持つ)
  6. 6. © 2020 NTT DATA Corporation 6 結論として GraalVMは ネイティブイメージ生成用ツール ではありません
  7. 7. © 2020 NTT DATA Corporation 7 GraalVMで検索するとネイティブイメージのことばかりなので… このセッションでは JITコンパイラと多言語実行に 比重を置きます
  8. 8. © 2020 NTT DATA Corporation 1. 新JITコンパイラ
  9. 9. © 2020 NTT DATA Corporation 9 GraalVM JITコンパイラは Javaで書かれた 新しいJITコンパイラ
  10. 10. © 2020 NTT DATA Corporation 10 そのJITコンパイラを HotSpot VM上に搭載
  11. 11. © 2020 NTT DATA Corporation 11 GraalVMとHotSpot VM • GraalVMはHotSpot VMがベース HotSpot VM Compiler Interface C2C1 HotSpot VM C++ GraalVM Compiler Interface GraalVM JITコンパイラC1 HotSpot VM JVMCI Java
  12. 12. © 2020 NTT DATA Corporation 12 GraalVMは JVMの機能を すべて包含します
  13. 13. © 2020 NTT DATA Corporation 13 既存のJVMにできることは すべてできます
  14. 14. © 2020 NTT DATA Corporation 14 Oracle Labsが 開発
  15. 15. © 2020 NTT DATA Corporation 15 GraalVMの2つのエディション https://www.graalvm.org/
  16. 16. © 2020 NTT DATA Corporation 16 GraalVMの2つのエディション 1. Community Edition (CE) • OSS (クラスパス例外付き GPL v2) 2. Enterprise Edition (EE) • ライセンス契約が必要 (評価は無償) • CEより実行パフォーマンスがよい • CEよりネイティブコードのセキュリティを強化している
  17. 17. © 2020 NTT DATA Corporation 17 以降は CEを前提にします
  18. 18. © 2020 NTT DATA Corporation 18 GraalVM JITコンパイラの 利点は?
  19. 19. © 2020 NTT DATA Corporation 19 アロケーションの多い アプリケーションには、 GraalVM JITコンパイラが 有効
  20. 20. © 2020 NTT DATA Corporation 20 たとえば リアクティブストリーム で構築したものや
  21. 21. © 2020 NTT DATA Corporation 21 Scalaなど 関数型プログラミング モデルで構築したもの
  22. 22. © 2020 NTT DATA Corporation 22 C2コンパイラより パフォーマンスが 向上する場合がある
  23. 23. © 2020 NTT DATA Corporation 23 ベンチマーク https://renaissance.dev/ Higher is better
  24. 24. © 2020 NTT DATA Corporation 24 Twitter社の事例 • OpenJDKベースの独自JDKにGraalVM JITコンパイラを バックポート • 2017年ですでに本番環境で活用 • 数千台のサーバ、Scalaアプリケーション • サーバリソースを削減し、台数削減 • 大きなコスト削減になった • 事例発表動画 • Twitter’s Quest for a Wholly Graal Runtime (JavaOne 2017) https://www.youtube.com/watch?v=G-vlQaPMAxg
  25. 25. © 2020 NTT DATA Corporation 25 GraalVM JITコンパイラの利点 1. Javaで書かれている • C++で書かれたC2コンパイラは 長年の変更で複雑化 • 新規に開発することで新機能追加、設計改善 • Javaに変更することで開発参加の門戸を広く • 以前はこのJITコンパイラをGraalと呼んでいた
  26. 26. © 2020 NTT DATA Corporation 26 参考:OpenJDKにもポートされている(Experimental) http://openjdk.java.net/jeps/317
  27. 27. © 2020 NTT DATA Corporation 27 GraalVM JITコンパイラの利点 2. このJITコンパイラ向けに作られた 言語実装用フレームワーク Truffle がある • このライブラリを用いて実装した言語は、 すべてGraalVM上で実行できる • トラフル (英)、トリュフ (仏)
  28. 28. © 2020 NTT DATA Corporation 2. 多言語実行環境
  29. 29. © 2020 NTT DATA Corporation 29 GraalVM JITコンパイラの利点 2. このJITコンパイラ向けに作られた 言語実装用フレームワーク Truffle がある • このライブラリを用いて実装した言語は、 すべてGraalVM上で実行できる • トラフル (英)、トリュフ (仏)
  30. 30. © 2020 NTT DATA Corporation 30 サポートする言語 GraalVM バージョン20.1.0時点のもの 言語 プロダクト名 ステータス 対応バージョン Java - - OpenJDK 8もしくは11から選択 JavaScript graaljs GA ECMAScript 2020準拠 Ruby TruffleRuby Experimental 2.6.2ベース R FastR Experimental 3.6.1ベース Python GraalPython Experimental 3.7ベース WebAssembly GraalWasm Experimental WebAssembly MVP仕様 LLVM Sulong Experimental bitcodeバージョン3.8~9.0を実行可能
  31. 31. © 2020 NTT DATA Corporation 31 (なお、Java 11で Nashornは非推奨に なりました)
  32. 32. © 2020 NTT DATA Corporation 32 Truffleでの言語実装 HotSpot VM JVMCI GraalVM JITコンパイラ JVM Lang Truffle LLVMJS R Ruby C C++ Fortran Interpreter
  33. 33. © 2020 NTT DATA Corporation 33 言語実装の仕組み 対象言語の ASTインタプリタを Truffle APIを用いて Javaで実装する
  34. 34. © 2020 NTT DATA Corporation 34 他言語でも高パフォーマンス 対象言語コードのASTと インタプリタの両方を JITコンパイラに評価させ 高性能のコードを生成
  35. 35. © 2020 NTT DATA Corporation 35 ゴールドマン・サックス社の事例 • 1990年代初め、独自に言語を開発 • 現在までコードが増え続ける • 言語自体の運用開発が課題に
  36. 36. © 2020 NTT DATA Corporation 36 ゴールドマン・サックス社の事例 • その言語をTruffleベースに移行 • 他言語との相互呼び出しが可能に • メトリクス取得やデバッグが容易に • 実行パフォーマンスが向上 • 事例発表動画 • One VM to Rule Them All? Lessons Learned with Truffle and Graal (Oracle Code One 2018) https://www.youtube.com/watch?v=MUECwHdr07Q
  37. 37. © 2020 NTT DATA Corporation 37 究極的には 自分で実装した プログラミング言語を GraalVMで実行できる
  38. 38. © 2020 NTT DATA Corporation 38 言語実装サンプル • GraalVMのリポジトリ内 • SimpleLanguage • https://github.com/graalvm/simplelanguage • Simpleとあるけれど、読むのは簡単ではない
  39. 39. © 2020 NTT DATA Corporation 39 私もやってみました(古いバージョンでの実装です) https://github.com/jyukutyo/JVM-Math-Language
  40. 40. © 2020 NTT DATA Corporation 40 サポートする言語 GraalVM バージョン20.1.0時点のもの 言語 プロダクト名 ステータス 対応バージョン Java - - OpenJDK 8もしくは11から選択 JavaScript graaljs GA ECMAScript 2020準拠 Ruby TruffleRuby Experimental 2.6.2ベース R FastR Experimental 3.6.1ベース Python GraalPython Experimental 3.7ベース WebAssembly GraalWasm Experimental WebAssembly MVP仕様 LLVM Sulong Experimental bitcodeバージョン3.8~9.0を実行可能
  41. 41. © 2020 NTT DATA Corporation 41 参考:GraalPythonの検証 • 実プロジェクトでの利用は(まだ)現実的ではない • C拡張しているライブラリの利用するとエラーが発生する可能性があり、 確実性に不安が残る • Pythonコードの実行が長い たとえばインポート文の処理に時間がかかる • Pandasであれば、インポートが数十秒単位であった • SSLをサポートしておらず、 PythonコードでのHTTPSのAPI呼び出しはできない • 20.2でpycファイルによるキャッシュ機能が導入されたが、 パフォーマンスは不十分である
  42. 42. © 2020 NTT DATA Corporation 42 デモ(Python3とGraalPythonでのPandasの実行)
  43. 43. © 2020 NTT DATA Corporation 43 Pythonに関しては やはりまだ Experimental
  44. 44. © 2020 NTT DATA Corporation 44 単に各言語を 実行できるだけでは ない
  45. 45. © 2020 NTT DATA Corporation 45 Interoperability パフォーマンスを大幅に 低下させることなく、 言語間で 相互呼び出しができる
  46. 46. © 2020 NTT DATA Corporation 46 Java <-> Truffle言語 はもちろん
  47. 47. © 2020 NTT DATA Corporation 47 Truffle言語間でも (Ruby <-> JavaScriptなど)
  48. 48. © 2020 NTT DATA Corporation 48 GraalVMのビジョン パフォーマンスを 犠牲にせず、 言語間の抽象化をする
  49. 49. © 2020 NTT DATA Corporation 49 あの処理、 別の言語のライブラリを 使うとすぐできるのに…
  50. 50. © 2020 NTT DATA Corporation 50 Javaから先ほどのPandasコードを呼び出す例
  51. 51. © 2020 NTT DATA Corporation 51 開発ツールの サポートもある
  52. 52. © 2020 NTT DATA Corporation 52 Google Chrome DevToolsでのデバッグ
  53. 53. © 2020 NTT DATA Corporation 53 デモ(Chrome DevToolsでのデバッグ)
  54. 54. © 2020 NTT DATA Corporation 54 Graal VisualVM
  55. 55. © 2020 NTT DATA Corporation 3. ネイティブイメージ生成機能
  56. 56. © 2020 NTT DATA Corporation 56 GraalVMのネイティブイメージ生成 • ネイティブイメージ (実行可能なバイナリ) を生成する機能 • 生成したイメージ (ファイル) だけで実行可能 • つまり、起動にJVM (JDK/JRE) が不要
  57. 57. © 2020 NTT DATA Corporation 57 Oracle Database • ユーザ定義関数をJavaで作成できる しかし、 • GraalVM自体をデータベースに組み込めば、 Javaはもちろん、他言語も使える • 機能の更新をGraalVM側に任せられる
  58. 58. © 2020 NTT DATA Corporation 58 Oracle Databaseに GraalVMを組み込む
  59. 59. © 2020 NTT DATA Corporation 59 Oracle Databaseへ組み込むには • JVMが課題 • サイズが大きい • 初期化処理が長い • メモリ使用量が大きい • そのままではデータベースでの利用はできない
  60. 60. © 2020 NTT DATA Corporation 60 GraalVM自体を ネイティブイメージに する!
  61. 61. © 2020 NTT DATA Corporation 61 ネイティブイメージにすると • JVMが不要 • サイズが小さく済む • 起動時間が短くなる • メモリ使用量が少なくなる • ただし、同じプラットフォームでしか動作しない
  62. 62. © 2020 NTT DATA Corporation 62 参考:Oracle Database MLE • MLE: Multilingal Engine • https://www.oracle.com/technetwork/database/multilingual- engine/overview/index.html select validator.isEmail('alice@example.com’) from dual;
  63. 63. © 2020 NTT DATA Corporation 63 こうした経緯で開発した ネイティブイメージ 生成機能が GraalVMの機能の1つ となった
  64. 64. © 2020 NTT DATA Corporation 64 ネイティブイメージの現状 • Experimental • サポートプラットフォーム • x86 64ビットシステム • Linux、macOS、Windows
  65. 65. © 2020 NTT DATA Corporation 65 ネイティブイメージ生成プロセス アプリケーション ライブラリ JDK SubstrateVM 下記の繰り返し: 解析ポイント ↓ 初期化処理実行 ↓ ヒープのスナップショット生成 ELFファイル コード (textセクション) イメージヒープ (dataセクション)
  66. 66. © 2020 NTT DATA Corporation 66 生成時に 初期化処理を実行し、 起動時間を 短縮する
  67. 67. © 2020 NTT DATA Corporation 67 デモ(ネイティブイメージ生成)
  68. 68. © 2020 NTT DATA Corporation 68 ネイティブイメージ対応フレームワーク • Micronaut • Quarkus • Helidon • Spring Framework, Bootも対応作業中 (現在はExperimental)
  69. 69. © 2020 NTT DATA Corporation 69 ネイティブイメージのメリットまとめ • 起動時間が短くなる • メモリ使用量が少なくなる • サイズが小さくなる
  70. 70. © 2020 NTT DATA Corporation 70 どんなアプリケーション でも、 ネイティブイメージに する方がよいのか?
  71. 71. © 2020 NTT DATA Corporation 71 JITコンパイル (JVM) と AOTコンパイル (GraalVM)
  72. 72. © 2020 NTT DATA Corporation 72 GraalVMのネイティブイメージ機能 • AOT(Ahead-of-Time:事前)コンパイル 「実行前」に 機械語へコンパイル!
  73. 73. © 2020 NTT DATA Corporation 73 JITコンパイル 「実行中」に 機械語へコンパイル! JVM
  74. 74. © 2020 NTT DATA Corporation 74 超簡略化して考えると… ❌ 「実行中」に 機械語へコンパイル! 「実行前」に 機械語へコンパイル!
  75. 75. © 2020 NTT DATA Corporation 75 同じようなことを やっているように 見えませんか?
  76. 76. © 2020 NTT DATA Corporation 76 2つのコンパイラの処理は 重なる部分があるため、 JITコンパイラを元にして ネイティブイメージ生成機能を 作ることができた
  77. 77. © 2020 NTT DATA Corporation 77 https://openjdk.java.net/jeps/295
  78. 78. © 2020 NTT DATA Corporation 78 ネイティブコンパイルを採用するトレードオフ • 事前にコンパイルしたものを使うので、 利用できない機能が出てくる • コードのinstrumentation • 動的な再最適化 • 性能のトレードオフ https://twitter.com/thomaswue/status/1145603781108928513
  79. 79. © 2020 NTT DATA Corporation 79 ネイティブイメージが適切なケース • FaaS • 起動してすぐに終了する • クラウドで実行する 大規模アプリケーション • リソースを節約し、コストを削減する
  80. 80. © 2020 NTT DATA Corporation 80 GraalVMの2つのモード • JITモード • JVMとGraalVM JITコンパイラで アプリケーションを実行 • AOTモード • ネイティブイメージを生成し、JVMなしで アプリケーションを実行 • どちらのモードのことなのか、意識する
  81. 81. © 2020 NTT DATA Corporation 4. GraalVMとOpenJDK
  82. 82. © 2020 NTT DATA Corporation 82 Project Metropolis OpenJDK: Metropolis https://openjdk.java.net/projects/metropolis/
  83. 83. © 2020 NTT DATA Corporation 83 JVMを 再実装する! (ランタイムの重要な部分中心)
  84. 84. © 2020 NTT DATA Corporation 84 再実装とは? C++の既存実装 ↓ Javaで再実装
  85. 85. © 2020 NTT DATA Corporation 85 Project Metropolisの現在 • 現在:Java 15ベースのEAビルドがある • https://jdk.java.net/metropolis/ • GraalVM JITコンパイラがデフォルトコンパイラ • ネイティブコンパイル済み • 次にどのコンポーネントがJava on Javaとなるのかは明らかでない • たとえばGCは難しいだろうと言われている
  86. 86. © 2020 NTT DATA Corporation 86 JITコンパイラが Javaで書かれていると
  87. 87. © 2020 NTT DATA Corporation 87 JITコンパイラの Javaコードも JITコンパイルする 必要がある
  88. 88. © 2020 NTT DATA Corporation 88 つまり アプリケーション起動時に その分の時間がかかる
  89. 89. © 2020 NTT DATA Corporation 89 JITコンパイラの コードをAOTコンパイル (ネイティブコンパイル) してしまえば ある程度解決できる
  90. 90. © 2020 NTT DATA Corporation 90 JITコンパイラコードのコンパイル JavaでJITコンパイラを書く ↓ そうなるとJITコンパイラのJavaコードを JITコンパイルすることが必要 ↓ あらかじめJITコンパイラのJavaコードを ネイティブコンパイルしておく (libgraal/libjvmcicompiler)
  91. 91. © 2020 NTT DATA Corporation 91 JVMとGraalVMは 互いに影響を 及ぼし合っている
  92. 92. © 2020 NTT DATA Corporation 92 ただし、互いに 独立した開発 となっている
  93. 93. © 2020 NTT DATA Corporation 93 GraalVMの3つの主機能 1. 新JITコンパイラによるパフォーマンス向上 2. JavaScript、Ruby、Pythonといった (JVM言語でない)言語を実行可能 3. アプリケーションをネイティブイメージにして JVMなしで実行可能 (JVMでの実行時とは異なる特性を持つ) みんなのJava OpenJDKから始まる大変革期! https://gihyo.jp/book/2020/978-4-297-11199-1
  94. 94. © 2020 NTT DATA Corporation本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です

×