applepie-umai / SpringFest2019

0 stars 0 forks source link

[Spring と GraalVM Native Image] [福本] #11

Open fukumotom opened 4 years ago

fukumotom commented 4 years ago

Spring と GraalVM Native Image

概要

native imageの概要とSpring FWのサポートについて

このセッションに関連するキーワード

セッションの内容

話の流れ

GraalVMについて、というよりはGraalVMのnative imageについて。 ただし、early adopter technologyであり、来年のSpring FW 5.3リリース時に変更がある可能性があるため注意が必要。

(参考) https://www.graalvm.org/docs/reference-manual/native-image/

GraalVM Native Imageを使用すると、JavaコードをNative Imageと呼ばれるスタンドアロンの実行可能ファイルに事前コンパイル(ahead-of-time AOTコンパイル)ができる。 それぞれの実行環境(OS)に合わせたライブラリ(macだとdylib、windowsだとdll)も作成が可能。 GraalVMは従来のJITコンパイルも可能

AOTコンパイルとはAOTはソースコードの静的解析でわかる範囲の情報 (エントリポイントからメソッド呼び出しをたどって得られる情報とか)だけでコンパイルを行う方法。 なので、実行時に生成されるようなものはできなかったり、苦手。 たとえば、リフレクションは単純なモノは可能だが、 複雑なモノは情報を事前に補足情報を設定することで可能になる。

ダイナミックプロキシ(IFを渡して実装クラスを実行時に生成) これも単純なモノは可能だが、複雑なものは補助情報を渡してあげる必要がある。

JVMとの機能の差分は以下に公開されている。 https://github.com/oracle/graal/blob/master/substratevm/LIMITATIONS.md

Springも中でリレクションもダイナミックproxyたくさん使っている。 現時点だと、設定ファイルを作成しないと使えない。 ただ、Spring 5.3/Spring Boot 2.2に向けて4つのspring-graal-native-featureが作られている。

考察したこと

新たに知ったこと

疑問点(記載したければ)

講義資料URL

https://www.slideshare.net/TakuyaIwatsuka?utm_campaign=profiletracking&utm_medium=sssite&utm_source=ssslideview

ogawaeri commented 4 years ago

Javaの実行はJVMと思っていたので、GraalVM Native Imageという別のVMがあることを初めて知りました。この辺はあまり分かって関わっていなかったので、難しかったですが、マイクロサービス化の影響がこういうところにも表れているんだなと分かりました。

Javaの起動がネックになることは度々聞くため、早くなることはいいことだと感じました。ただ、プラットフォーム毎にビルドが必要ということでJavaの環境を問わないよい点と矛盾を感じました。(プラットフォームごとにAOTコンパイルをするということでしょうか?)

マイクロサービス化で機能が独立して起動 同じシステム内の別の機能間(別サービス)を呼び出すたびにJavaの起動があったら、確かに時間がかかりますね。。他のセッションのレポートにも"高速化"がキーワードのものがあったの読んでみます!

fukumotom commented 4 years ago

コメントありがとうございます!

ただ、プラットフォーム毎にビルドが必要ということでJavaの環境を問わないよい点と矛盾を感じました。(プラットフォームごとにAOTコンパイルをするということでしょうか?)

プラットフォームごとにAOTコンパイルが必要ということです。 なので、JVMではビルドしたファイルがあれば実行できるので、GraalVMのデメリットとして挙げられているようです。

ogawaeri commented 4 years ago

コメントありがとうございます!

ただ、プラットフォーム毎にビルドが必要ということでJavaの環境を問わないよい点と矛盾を感じました。(プラットフォームごとにAOTコンパイルをするということでしょうか?)

プラットフォームごとにAOTコンパイルが必要ということです。 なので、JVMではビルドしたファイルがあれば実行できるので、GraalVMのデメリットとして挙げられているようです。

ありがとうございます!今はコンパイルの手間はかかるけど起動は早い、というものなんだね。こうしたら早いかも…と組み合わせて試せる技術はすごいよね。