API構築の基礎を学んだ。QConは、開発者コミュニティにおける知識とイノベーションの普及を促進することで、ソフトウェア開発に力を与える。実務者主導のカンファレンスであるQConは、チーム内のイノベーションに影響を与える技術チームのリーダー、アーキテクト、エンジニアリングディレクター、プロジェクトマネージャー向けにデザインされている。Sheehy氏は、人工知能ハイプ時代における責任ある開発者としてのあり方について、洞察に富んだ開会基調講演をした。Grizzanti氏が、「スタッフ・プラス」への道と、それを「科学」というより「芸術」としてとらえ、芸術を創作することとソフトウェアを創作すること、そして組織のダイナミクスに対処することの類似性について語っている。Codeを採用する:確認するべき6つの適性LCNC(ローコード/ノーコード)プラットフォームは、プログラマーだけでなくプログラマーでなくても、最小限のコーディングとワンクリックのデプロイメントで、アプリケーションソフトウェアを開発できるよう設計されている。ドラッグ&ドロップ方式のインターフェースなどを利用することで、開発・デプロイメントプロセスを簡素化し、効率的なアプリケーション開発とデプロイメントを実現する。etc.原文(投稿日:2022/04/14)へのリンクJavaはエンタープライズアプリケーションの主流です。クラウドにおいては、一部の競合技術よりも高価な選択となっています。-起動が非常に速く、メモリ使用量の少ないアプリケーションを実現するのです。そのため、ネイティブコンパイルは、すべてのJavaユーザに対して多くの疑問を投げかけます。ネイティブJavaは開発をどう変えるのか?ネイティブJavaに切り替えるべきなのはいつか?切り替えない方がよいのは、どのような場合か?どのフレームワークを使用すればよいのか?このシリーズでは、これらの疑問に答えていきたいと思います。Java"シリーズの一部です。シリーズに関しては、RSSによる通知の登録が可能です。関連スポンサーコンテンツ3年前のローンチ以来、GraalVMは、Java開発に革命を起こしてきました。Imageは、これまでのJavaエコシステムが持っていた開発者生産性とツーリングを維持しながら、ネイティブアプリケーションの実行時パフォーマンスプロファイルを実現します。従来のJavaアプリケーションの実行方法Javaプラットフォームの最も強力かつ興味深い部分のひとつとして、その素晴らしいピークパフォーマンスを実現しているものは、Java仮想マシン(JVM)によるコードの実行方法です。アプリケーションが初めて実行されると、VMはそのコードを解釈して、プロファイリング情報を収集します。JVMインタプリタのパフォーマンスは高いものの、コンパイルされたコードの実行ほど速くはありません。そのため、OracleのJVM(HotSpot)には、ジャスト・イン・タイム(JIT)コンパイラも搭載されています。プログラムの実行と合わせて、アプリケーションコードをマシンコードにコンパイルするのです。JITコンパイラによるマシンコードへのコンパイルが行われます。実行が繰り返されて、一定のしきい値に到達すると、トップティア(top-tier)JITコンパイラ(C2あるいはGraalコンパイラ)によるコンパイルが実行されます。トップティアコンパイラは、どのコードブランチが最も頻繁に実行されるか、ループが何度実行されるか、どの型がポリモルフィックコードで使用されるか、といったプロファイル情報に基づいた最適化を行います。optimization)も実行します。これによって、例えば、収集したプロファイル情報に基づいて最適化された、コンパイル済バージョンのメソッドを生成することが可能になるのです。JVMのコード実行は動的であるため、後にその仮定が無効になった場合、JVMは脱最適化(deoptimize)、すなわちコンパイル済コードを破棄してインタプリタモードに戻ります。コードを速く起動する一方で、繰り返し実行されるコードには最適化コンパイラを活用し、さらにアグレッシブな最適化の適用も検討するのです。一見すると、このアプローチは、アプリケーションを実行する理想的な方法のように思えます。それは何なのでしょうか?まず、JVMが行うオペレーション(コードの検証、クラスのロード、動的コンパイル、プロファイル情報の収集など)は、複雑な計算を伴うことから、実行には相応のCPU時間を必要とします。そのコストに加えて、プロファイル情報を格納するために相当量のメモリが必要になります。起動時に要する時間やメモリも、それに応じたものになるのです。多くの企業がアプリケーションをクラウドに展開しているため、このコストはさらに重要なものになります。起動時間やメモリの使用量は、アプリケーションの展開コストに直接的に関わってくるからです。それでは、起動時間やメモリ使用量を抑制しながら、Javaの持つ生産性やライブラリやツーリングといったメリットを引き続き享受できる方法はないのでしょうか?答は"イエス"です。Labsの研究プロジェクトとして始まりました。LabsはOracleのR&D部門で、プログラミング言語や仮想マシン、マシンラーニング、セキュリテイ、グラフ処理、その他の領域に取り組んでいます。その活動を示す好例のひとつがGraalVMです。GraalVMは、長年にわたる研究と、100を数える発表論文に基いています。プロジェクトの中核をなすのは、Graalコンパイラです。高度な最適化機能を備えた、最新のこのコンパイラは、スクラッチから開発されました。その高度な最適化により、多くのシナリオにおいて、C2コンパイラよりも優れたコードを生成することが可能です。analysis)です。これは、オブジェクトがコンパイル単位をエスケープしないブランチにおいて、スカラ置換によってヒープ上の不要なオブジェクト割り当てを取り除くものです。エスケープを行うオブジェクトに関しては、それがヒープ内に存在することをGraalコンパイラが保証します。このアプローチは、ヒープ上に存在するオブジェクトの数を少なくすることによって、メモリフットプリントを削減します。ガベージコレクションの必要性も低くなることから、CPUの負荷も低減することができます。GraalVMの高度な推測機能は、動的な実行時フィードバックを活用して、より高速なマシンコードを生成します。プログラムの特定部分が実行されないと推測することによって、GraalVMコンパイラは、コードをさらに効率的なものにすることができるのです。このGraalコンパイラの大部分がJavaで記述されていると知れば、驚くかも知れません。GitHubリポジトリにあるGraalVMのコアを見ると、そこにあるコードの90パーセント以上がJavaプログラミング言語で記述されていることが分かります。Javaの強力さ、多用途性を改めて認識することになるでしょう。ネイティブイメージの動作GraalコンパイラはAOT(ahead-of-time)コンパイラとしても機能して、ネイティブな実行ファイルを生成します。動的な性質を持つJavaにおいて、実際にはどのように動作するのでしょうか?コンパイルと実行が同時に行われるJITモードとは異なり、AOTモードでは実行前のビルド時に、すべてのコンパイルが行われます。すべてビルド時に移動するというものです。一度コンパイルしておけば、実行時には生成済の実行ファイルが高速に起動します。すべてが事前に計算され、コンパイルされることで、実行準備が最初から整っているのです。ユーティリティは、Javaバイトコードの入力からネイティブな実行ファイルを出力します。assumption)に基づいたバイトコードの静的解析を行っています。この解析では、アプリケーションが実際に使用するコードをすべて探索して、不要なものはすべて削除します。Imageの生成プロセスをよりよく理解できるでしょう。Imageは、実行時に到達可能なクラス、メソッド、フィールドを判断して、それらのみをネイティブ実行イメージに含めるようにします。通常はアプリケーションのmainメソッドを始点として、定点に達して解析が終了するまで、遷移的に到達可能なすべてのコードパスを反復的に処理します。アプリケーションだけでなく、ライブラリやJDKクラスも対象です。これによって、アプリケーションのパッケージングに必要なすべてのものが、自己完結型のバイナリに格納されるのです。Imageは、正しい動作を保証するために、デフォルトでは実行時にクラスの初期化を行っていますが、安全であることが証明可能なクラスに関しては、ビルド時に初期化を行います。これによって、実行時の初期化とチェックが不要になり、パフォーマンスが向上します。Imageのヒープスナップショットは、その話題だけでひとつの記事が書けるような、非常に興味深い機能です。イメージの構築プロセス中、静的イニシャライザによってアロケートされるJavaオブジェクトと、到達可能なオブジェクトは、すべてイメージヒープ上に書き込まれます。事前にヒープを設定しておけば、アプリケーションの起動は大幅に高速化されるのです。興味深いのは、ポインタ解析によってイメージヒープ内のオブジェクトが到達可能になり、イメージヒープを構築するスナップショット処理によって新たなメソッドがポインタ解析で到達可能になるということです。ポインタ解析とヒープスナップショットは、定点に到達するまで反復的に実行されるのです。ネイティブイメージ構築プロセス解析が完了すると、到達可能なすべてのコードが、プラットフォーム依存のネイティブな実行形式にコンパイルされます。この実行形式はそれ自体で完全に機能するもので、実行時にJVMを必要としません。結果として、機能的には完全に同じでありながら、必要なコードと依存関係のみを含んだ、スリムで高速なネイティブ実行バージョンのJavaアプリケーションが完成します。ガベージコレクタやスレッドスケジューラといった実行時コンポーネントを提供するスリムなVM実装が含まれているのです。VMもJavaプログラミング言語で記述されています。Imageは、あなたのJavaアプリケーションにまったく新しいパフォーマンスプロファイルを実現してくれます。次に、これを詳しく見ていきましょう。Imageで生成された実行ファイルは起動パフォーマンスが優れている、という話を聞いたことがあるかも知れません。具体的にはどういうことなのでしょう?短時間で起動。コードがまず検証され、解釈され、それから(ウォームアップ後に)最終的にコンパイルされる、というJVM上での実行とは違い、ネイティブ実行形式は最初から最適化されたマシンコードになっています。これを説明する上で私がよく使うのは、"インスタントパフォーマンス"という用語です。プロファイリングやコンパイルといったオーバヘッドを伴わずに、実行の数ミリ秒後からアプリケーションが有意な処理を行うことができるようになる、という意味です。Imageモードの起動時間への影響メモリ効率ネイティブな実行形式は、JVMやJITコンパイルインフラも、コンパイルしたコードを格納するメモリも、プロファイルデータも、バイトコードキャッシュも必要としません。必要なのは、実行形式とアプリケーションデータのためのメモリのみです。上のグラフは、JVM(左)およびネイティブ実行形式(右)におけるWebサーバの動作状況を示したものです。青色の線はメモリ使用量を示しています。JITモードが200MBであるのに対して、ネイティブ実行形式では40MBです。赤色の線はCPUのアクティビティです。JVMが前述したJITのウォームアップ処理中にCPUを多用しているのに比べると、高価な計算処理をすべてビルド時に実行しているネイティブ実行形式では、CPUをほとんど使用しません。Imageは、その処理時間の短さとリソース使用量の少なさから、マイクロサービスやサーバレス、さらにはクラウドワークロード一般の大幅なコスト低減を可能にする、優れた展開モデルとなっています。パッケージサイズネイティブ実行形式には必要なコードのみが格納されるため、アプリケーションコードとライブラリとJVMを組み合わせたサイズよりも大幅に小さくなります。リソースに制約のある環境での運用などのシナリオでは、アプリケーションのパッケージサイズが重要な場合があります。UPXのようなユーティリティを使えば、ネイティブ実行形式はさらに小さくなります。Imageでは、起動の高速性と合わせて、優れたピークパフォーマンスを提供できるような取り組みを行っています。いくつかの、ネイティブ実行形式のピークパフォーマンスを改善する方法があります。Imageはコードの最適化とコンパイルを事前に行うので、アプリケーション実行時に、実行中のプロファイル情報にアクセスしてコードを最適化することはありません。optimization、PGO)の実施です。PGOでは、アプリケーションを実行して収集したプロファイル情報を、ネイティブイメージ生成プロセスにフィードバックします。‘native-image‘ユーティリティはこの情報を使用することで、アプリケーションの実行時の動作に基づいて、最終的な実行ファイルのパフォーマンスを最適化します。Enterpriseで使用可能です。これはヒープサイズの小さなマイクロサービスに適しています。使用可能なGCオプションは他にもあります。GCには、若い世代用のSurvivor領域を有効にすることで、アプリケーション実行時のメモリフットプリントを削減するという、新たなポリシが追加されました。Petclinicのような一般的なマイクロサービスワークロードにおいて、最大で23.22パーセントのピークスループット改善を確認しています。Enterpriseで使用可能)。大規模なヒープにはこちらが適しています。Imageを使用したアプリケーションのパフォーマンスを最大化することが可能になります。ImageはJavaアプリケーションのまったく新しい実行方法であるため、注意すべき点がいくつかあります。Imageがリフレクションをサポートしていない、という話を聞いたことがあるかも知れませんが、これは事実ではありません。assumption)の下で静的解析を行います。そのため、リフレクションのような動的な機能に関しては、ビルドプロセスを正しく実行するための付加的な設定が必要になります。APIの呼び出しの検出と処置を試みます。一般論として、この自動解析は必ずしも十分ではありません。実行時にリフレクション経由でアクセスされるプログラム要素を、コンフィギュレーションを通じて特定する必要があるのです。Imageトレースエージェントを利用することも可能です。このエージェントは、JVM上でのプログラム実行中に使用される動的機能を追跡して、コンフィギュレーションファイルを生成します。Imageユーティリティはこのファイルを使って、リフレクション経由でアクセスされるプログラム部分を生成コードに含めるのです。エージェントは最初のコンフィギュレーションを作成するには便利ですが、必要に応じて手作業による調査と補完を行うことをお勧めします。Interface(JNI)やProxyオブジェクト、クラスパスリソースなどを使用する場合にも、同じようなコンフィギュレーションが必要になることがありますが、これらの機能に関しても、同じトレースエージェントを使って設定を行うことができます。Dashboardを使えば、ネイティブ実行ファイルに含まれるパッケージやクラス、メソッドの確認や、ヒープ内で最も多くの空間を占めているオブジェクトの特定が可能になります。Imageは、アプリケーションのリソース使用プロファイルに大きな影響を与えられることから、クラウド展開において大きな違いを生み出します。Imageの生成するネイティブ実行ファイルの起動が速く、メモリ使用量の少ないことを見てきました。Imageで生成したアプリケーションは、実行にJVMを必要としません。アプリケーションの実行に必要なすべてのものを含んでいるため、自己完結が可能です。これはつまり、アプリケーションだけをスリムなDockerイメージに置けば、それだけで完全に機能するものになる、ということです。イメージのサイズは、アプリケーションが何をするか、どのような依存関係を含むかによって変わります。World!"アプリケーションは、およそ20MBになります。Imageを使えば、静的、ないしほぼ静的な実行ファイルを作ることも可能です。静的(mostly-static)な実行ファイルでは、コンテナイメージが提供する‘libc'以外の、すべてのライブラリが静的リンクされています。いわゆるディストロレス(distroless)コンテナイメージを使って、軽量なデプロイメントを行うこともできます。ディストロレスイメージとは、アプリケーションを実行するためのライブラリだけを含む、シェルやパッケージマネージャなど、他のプラグラムを持たないイメージです。Dockerfileは、次のようなシンプルなものになります。["/app"]```コンテナイメージのlibcも必要としない、完全自立型のデプロイメントを行うには、アプリケーションに'musl-libc'を静的にリンクします。Dockerイメージに置くことも可能です。Imageを使って生成することによるアプリケーションのパフォーマンスの最大化について議論するとともに、ビルドプロセス中に利用できる有用なハックをいくつか紹介してきました。Javaアプリケーションをネイティブ実行ファイルとして構築、テスト、実行する手順を簡略化するには、GraalVMチームの提供するMavenおよびGradle用の公式プラグインを使用してください。5テストもサポートしています。JUnit、Micronaut、Springの各チームの協力で開発された公式プラグインは、JVMエコシステムにおけるコラボレーションの好例とも言えます。GraalVM"を使用します。コンフィギュレーション可能なこのアクションは、複数のGraalVMリリースと開発者のビルドをサポートして、GraalVMと指定されたコンポーネントの完全なセットアップを行います。ツーリングについても少し触れておきましょう。実行ファイルとして配布するJavaアプリケーションの開発には、通常の開発で使用するものと同じツールを使用することができます。Imageユーティリティを使ったネイティブコンパイルのステップを実行すればよいのです。Imageコンパイルに時間を要する場合があるので、最終ステップとして実行するとよいでしょう。私たちは今、プロダクション展開に必要な最適化の多くを実施しないことで、コンパイル時間を大幅に短縮できる、"クイック開発モード"に取り組んでいます。アプリケーションの開発はJVM上で行って、開発プロセスの最後の方でネイティブ実行ファイルを生成することが可能なのですが、それでもコミュニティからは、ビルド時間とリソース使用量の改善に対する要求が数多く寄せられています。この問題については、過去数回のリリースを通じて多くの作業を行いました。Javaアプリケーションから13.8秒程度でネイティブ実行ファイルを生成することができます。実行ファイルのサイズは5MB程度です。メモリ使用量も10パーセント程度削減できました。Imageを使って実行ビルドをデバッグするには、コマンドラインから'gdb'を使用するか(LinuxまたはmacOS)、GraalVMのVSCodeエクステンションを使用します。こちらのチュートリアルに、ステップ・バイ・ステップの説明があります。Recorderを使用します。Imageの完全なサポートはまだ開発途中ですが、カスタムイベントやシステムイベントの監視はすでに可能です。その他のパフォーマンス監視としては、ネイティブ実行ファイルのヒープダンプを生成してVisualVMなどのツールで解析する、という方法もあります。Enterpriseの機能です。Javaフレームワークでの採用Javaフレームワークのサポートがなければ、業務レベルのアプリケーション開発は非常に困難なものになりますが、幸いにもその心配はありません。Imageをサポートしているからです。Imageを使用することでアプリケーションの起動時間やリソース使用量が大幅に改善されるため、効率的なクラウド展開には完璧なものになります。Imageをフレームワークで使用する方法について解説する予定です。Imageは長足の進歩を遂げています。Imageとの連携を用意しています。開発者エクスペリエンスにもいくつかの変更を加えました。昨年の調査では、GraalVMを使用する開発者の70パーセントが、ネイティブ実行ファイルの開発と配布に使用している、という結果が出ています。Imageの新機能や改良についても、次のように数多くのアイデアがあります。Imageを前進させ、すべてのJava開発者に対してさらに有用なものにする上での、コミュニティやパートナの協力に感謝しています。Imageに望む新機能や改善がありましたら、GraalVMのコミュニティプラットフォームを通じてフィードバックをお寄せください。Javaはエンタープライズアプリケーションの主流です。クラウドにおいては、一部の競合技術よりも高価な選択となっています。-起動が非常に速く、メモリ使用量の少ないアプリケーションを実現するのです。そのため、ネイティブコンパイルは、すべてのJavaユーザに対して多くの疑問を投げかけます。ネイティブJavaは開発をどう変えるのか?ネイティブJavaに切り替えるべきなのはいつか?切り替えない方がよいのは、どのような場合か?どのフレームワークを使用すればよいのか?このシリーズでは、これらの疑問に答えていきたいと思います。Java"シリーズの一部です。シリーズに関しては、RSSによる通知の登録が可能です。毎週火曜日に前週のまとめコンテンツをお送りいたします。(日本語版は不定期リリース)25万人のシニアな開発者コミュニティーにぜひご参加ください。サンプルを見るあなたのメールアドレスはこちら国を選んでください。プライバシーポリシーに従って私の個人情報を扱うことに同意します。毎週火曜日に前週のまとめコンテンツをお送りいたします。(日本語版は不定期リリース)25万人のシニアな開発者コミュニティーにぜひご参加ください。サンプルを見る様々なイノベーターとアーリーアダプターがお送りするテクノロジーの概要を見る。自分がまだ知らないことに気づいていないと知るあなたが興味のあるトピックスをいつでも最新な情報に。あなたのメールアドレスはこちら国を選んでください。プライバシーポリシーに従って私の個人情報を扱うことに同意します。Inc.プライバシーBT。