proftoolのREADMEhttps://github.com/graalvm/mx/blob/master/README-proftool.mdこのツールは、JITパフォーマンス分析を支援するために、実行に関するマシンレベルの詳細を提供することを目的としています。LogCompilation情報のパーサーが含まれています。これらのコンポーネントを1つのコマンドラインにまとめることで、perfプロファイル情報をJITコードに帰属させることができます。プロファイルの収集は現在LinuxのPerfのみをサポートしていますが、一度データを取得すれば、そのプロファイルをどこでも見ることができます。このツールについては、後続のエントリで詳しく説明する予定です。configuration)が導入されました。Proxyオブジェクトの設定ファイルエントリが、クラスの到達可能性に基づいて条件付きで設定できるようになりました。条件付き構成では、提供された条件を満たす場合にのみ、クラス構成エントリが適用されます。これは指定されたタイプが他のコードで到達可能な場合に構成エントリを有効にするものです。リフレクティブ・アクセスをサポートするには、次のように構成します。]}このおかげでより正確な設定が可能となり、ネイティブ実行ファイルのサイズを小さくできます。条件付きリフレクションについては、この後のブログで詳しくご紹介します。Imageに関するもう一つのアップデートは特にコミュニティから待望されていたものです。Imageで改善してほしいことの第1位はビルド時間でした。202121.3では、過去数回のリリースにおけるビルド時間とメモリ使用量の改善に向けた一貫した取り組みが反映されています。実際21.2でも、ビルド時間が20%短縮され、メモリ使用量が9%程度削減されたとのコミュニティからの改善報告がありました。202121.3では、これらの改善がさらに進んでいます。petclinic-jdbcのイメージサイズとイメージビルド時間の変化を測定しました。Deleuze氏の最近の講演をご覧ください。最新の機能、パフォーマンスの数値、GAの計画などが紹介されています。Imageでは、静的解析の精度を上げるために、小さなメソッドが静的解析の前にインライン化されるようになりました。これにより、定数の折り返しが改善され、驚きが減ります。finalフィールドにアクセスするコードでは、最適化の仕方が異なりました。platforms.(静的解析では、静的解析前のメソッド呼び出しで定数折り畳みができなかったため、このコードは到達可能と判定されました。}}21.3では、リフレクションのメタデータの保存方法も変更されました。Imageは、クエリされたリフレクションメソッドと呼び出されたリフレクションメソッドを区別するようになりました。この区別により、イメージサイズがさらに小さくなります。webmvc-tomcatでは、イメージサイズが9%減少しています。Jackson.https://github.com/spring-projects-experimental/spring-native/tree/main/samples/webmvc-tomcatメタデータの問い合わせにのみ使用するメソッドをマークするためには、以下の例のようにreflection-configurationエントリの前にqueryを付ける必要があります。Imageエージェントは、クエリされたメソッドと呼び出されたメソッドを区別して、適切な設定を出力します。21.3のもう一つの大きなアップデートは、Javaプラットフォームのモジュールシステムの初期サポートです。Imageジェネレータは、-m(または--module)、-p(または--module-path)、--add-exports、--add-opensといった、Javaランチャーで知られているモジュール関連のオプションを受け付けるようになりました。-mや-pのようなモジュール関連の引数が使われると、イメージ・ジェネレーター自体がJavaモジュールのセットとして実行されます。今回の変更は、イメージ・ジェネレータの動作を大きく変えるものであり、モジュール・システムのより多くの側面をサポートするために、現在も開発が続けられています。この新機能をお試しになった際には、フィードバックやバグレポートをお願いします。base-module.jarとapp-module.jarの2つのJavaモジュールからイメージを作成できます。モジュールsample.appにはメインクラスが含まれています。Imageのピークパフォーマンスが大幅に改善されました。optimizations、PGO)とG1により、ネイティブ実行ファイルは起動時のパフォーマンスとリソース使用量に加えて、OpenJDKと同等のピーク・パフォーマンスを達成しています。ImageのパフォーマンスはOpenJDKと同等ですネイティブイメージのパフォーマンスに関連するもう一つの素晴らしいアップデートは、アプリケーションのランタイムメモリーフットプリントを削減するためのシリアルGCの新しいポリシーです。generationのためのsurvivorスペースを有効にします。GCでは、ルートポインタのためにイメージヒープ全体をスキャンすることはなくなり、書き込まれたイメージヒープの一部のみがスキャンされるようになりました。新しいポリシーをテストして、何か問題があれば報告してください。17にも対応しています。Embedding今回のリリースでは、内蔵のCPUサンプラーツールの使い勝手と精度を大幅に向上させました。CPUサンプラーは、すべてのポリグロット言語で動作し、すべてのランチャーに内蔵されたコマンドラインツールとして提供されます。以下の点が改善されました。新しいゲスト言語のセーフポイント機構を使用することで、サンプリング出力の精度が向上しました。サンプリング出力では、デフォルトでコンパイル単位に加えてインライン・メソッドも表示されるようになりました。デフォルトのサンプリング・ヒストグラムの出力が簡素化され、各最適化層での時間を表示する--cpusampler.ShowTiersオプションが追加されました。CPUSamplerにSVGフレームグラフの出力形式を追加しました。これを有効にするには、新しい--cpusampler.Output=flamegraphオプションを使用します。flamegraphこのflamegraphの例は、以下のコマンドを実行して作成したものです。Caching(補助エンジンキャッシング)と呼ばれるコード・スナップショット機能の安定性とパフォーマンスの向上が含まれています。Cachingは、Truffleのゲスト言語プログラムの(ロード、パーシング、プロファイリング、コンパイルなどの操作に起因する)ウォーミングアップを解消することを目的としています。1つのOSプロセス内では、ウォームアップ中に行われる作業をプロセス内エンジンキャッシングで共有できます。Cachingは、このメカニズムをベースに、ASTと最適化されたマシンコードを含むコードスナップショットをディスクに保存する機能を追加したものです。これにより、ゲストアプリケーションの最初の実行でも、ウォームアップを大幅に削減できます。この機能を実現するために、アプリケーションを変更する必要はありません。この機能の詳細については、近日中にブログ記事でご紹介します。組み込み開発者向けに、コンテクスト間で値を共有する機能が追加されました。これまで値の共有は、プリミティブとホスト値に対してのみサポートされていましたが、ゲスト値に対してはエラーが発生していました。この制限は今回のリリースで解除されました。enabled)で完全に無効にすることもできます。厳密な安全性が求められ、あるコンテキストの値が別のコンテキストに渡されるとエラーになってしまうような場合には、共有をオフにすると便利です。#631を解決するもので、すでにコミュニティから暖かく迎えられています。scoping)です。値のスコーピングが設定されたゲストアプリケーションから呼び出されたホストメソッドは、メソッドが戻る際に渡された値を自動的に解放します。これにより、組み込み開発者は、値がホストメソッド呼び出しのライフタイムを超えないようにすることができます。メソッドが返された後にスコープ対象の値にアクセスすると、エラーが発生します。プリセットを使用して有効にできます。今回のリリースでは、言語実装者向けに、静的オブジェクトを実装するための新しいAPIが追加されました。APIは、一度定義すると、プロパティの数やタイプが変わらないオブジェクトのレイアウトを表現できます。静的プログラミング言語のオブジェクトモデルの実装に適していますが、これに限定されるものではありません。今回のリリースでは、すべてのプラットフォームにおいて、言語コンテキストの検索が大幅に高速化されています。JavaScript21.3では、Node.jsのバージョンが14.17.6に更新され、新機能とセキュリティ修正が含まれています。Object.hasOwnPropertyなど、いくつかの新しいECMAScriptの提案を実装しました。これらを試すには、対応するフラグ(例:--js.error-cause、--js.import-assertions)を使用してください。GraalVMのWebAssemblyサポートを改善し、JavaScriptのBigIntからWebAssemblyのi64への統合を含む、いくつかの完全性とパフォーマンスの修正を行いました。APIhttps://github.com/WebAssembly/JS-BigInt-integrationPython21.3におけるPythonの主な改善点は、HPyネイティブ拡張のバイナリサポートが追加されたことで、これにより、CPythonと同じHPyバイナリパッケージを再コンパイルせずに実行できるようになりました。1つの注目すべき改善点は、マルチプロセシングモジュールのサポートで、マルチコアマシン上の複数のPythonコンテキストにまたがるタスクのオーケストレーションをサポートしています。indices)を計算する場合、すべてのコアを利用するようにスケールアップできます。4つのワーカーを備えたマルチプロセシングプールを使用すれば、このワークロードのパフォーマンスは3倍になります。この機能はコミュニティからの要望が高かったため、今後のフィードバックを期待しています。一つの改善点は、ネイティブコードを使用して書き直されたソケットモジュールで、以前よりもはるかに幅広いネットワークユースケースが動作するようになりました。ネイティブ拡張を使用して開いたソケットの適切なインタラクションが含まれます。使用するより多くのネイティブエクステンションが実行できるようになりました。21.3で動作します。Pythonhttps://github.com/emcconville/wandRuby正規表現を多用するワークロードを高速化するために、TruffleRubyではTRegexを採用しました。APIを使用して、効率的に正規表現を実行する、汎用の正規表現エンジンです。TRegexは、ECMAScriptの正規表現とPythonの正規表現のサブセットの実装を提供していますが、今回、Rubyにも対応しました。特徴は、正規表現を有限状態オートマトンにコンパイルすることです。これは、マッチを検索する際のパフォーマンスが予測可能であることを意味します(入力のサイズに対して線形)。TRegexをデフォルトで使用することで、TruffleRubyは正規表現のマッチングを大幅に高速化できます。TRegexを使ったTruffleRubyでは、大きな正規表現のベンチマークで最大9倍の速度が出ていることがわかります。Haider氏によるRubyKaigiセッションをご覧ください。その他の改良点として、TruffleRubyでは、Polyglotモードでの外部オブジェクトのtrait(配列、ハッシュ、イテレートなど)が完全に統合され、Rubyと同じように動作するようになりました。contexts)もサポートされています。FastRGraalVMのR実装であるFastRでは、引き続き互換性を重視しています。PCREからPCRE2バージョン10.37へのアップグレードが行われました。PCRE2(PCRE2への移行)の章を確認してください。コンパイル時の設定を改善し、さらにいくつかの使い勝手の向上とバグの修正を行いました。起動時のパフォーマンスも大幅に改善されています。比較してみます(最初の反復時間を測定しているため、低い方が良い結果です)。Truffleの起動パフォーマンスその他の変更点については、リリースノートやプロジェクトの変更履歴をご覧ください。Changeloghttps://github.com/oracle/graal/blob/master/espresso/CHANGELOG.md#version-2130WebAssembly過去数回のリリースでは、GraalVMのWebAssemblyランタイムのパフォーマンス改善に取り組んできましたが、その結果、注目すべき変化がありました。Interfaceに基づいて行われるようになりました。その他の変更点については、リリースノートやプロジェクトの変更履歴をご覧ください。RuntimeC/C++をコンパイルするLLVMツールチェーンがバージョン12.0.1に更新されました。C/C++https://www.graalvm.org/reference-manual/llvm/Compiling/#llvm-toolchain-for-compiling-ccまた、コードベースを「マネージドモード」と「ネイティブモード」のコードでモジュール化しました。Enterprisehttps://www.graalvm.org/reference-manual/llvm/NativeExecution/#limitations-and-differences-to-managed-execution-on-top-of-graalvm-enterpriseこれにより、マネージドモードとネイティブモードの間の静的なビルド依存性が軽減されると同時に、マネージドモードのコードベースは、管理されていないメモリアクセスをすべて削除することで、より堅牢になりました。ExtensionにKubernetesのサポートが追加されました。Codeから直接行うことができます。Micronaut用の以下のクイックアクションが有効になっています。Kubernetesアクションを呼び出すと、Javaプロジェクトをパッケージ化し、Dockerイメージをビルドして、コンテナレジストリにプッシュします。DeploymentをKubernetesクラスタ内に作成し、ローカルポートはPod内で動作するアプリケーションに転送されます。Pack内からこのプロジェクトをデバッグできます。アクションを起動します。Podのデバッグを行います。Imageのデバッグが大幅に改善されました。ネイティブイメージのプロセスにデバッガーをアタッチして、イメージのリアルなコードをステップオーバーできるようになりました。デバッガーをネイティブの実行ファイルにアタッチするには、launch.jsonに設定を追加します。Process”を選択します。Image”の構成を生成します。この構成を選択して実行すると、実行プロセスのリストが現れますので、ネイティブ実行ファイルに対応するものを選択してください。17でも動作するようアップデートされました。Conclusionこのリリースで行われたすべてのアップデートゆえに、GraalVMのバージョンのアップデートにはちょうどよい機会です。Communityの両方の新しいビルドを入手できます。Enterprisehttps://www.oracle.com/downloads/graalvm-downloads.htmlこのリリースに寄せられたすべてのフィードバック、提案、貢献に対して、コミュニティのみなさまに感謝しております。このリリースに関する追加のフィードバックや、今後の機能に期待する機能の提案があれば、Slack、GitHub、Twitterでお知らせください。コメントをキャンセルコメントを入力してください。以下に詳細を記入するか、アイコンをクリックしてログインしてください。アカウントを使ってコメントしています。アカウントを使ってコメントしています。新しいコメントがついたらメールで通知。Inside現在40人フォロワーがいます。購読管理このバーを折りたたむ%d人のブロガーが「いいね」をつけました。