国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ Java &#&チュートリアル Java もサーバーレスにできる: GraalVM を使用した高速コールド スタート

Java もサーバーレスにできる: GraalVM を使用した高速コールド スタート

Jan 07, 2025 am 06:16 AM

導(dǎo)入

サーバーレス コードを操作する場(chǎng)合の非常に一般的なアプローチは、コールド スタートが非常に速いという評(píng)判を考慮して、Python、Node、または Go アプリケーションとしてコードを記述することです。

Java Can Be Serverless Too: Using GraalVM for Fast Cold Starts

しかし、AWS Lambda などのサーバーレス環(huán)境をターゲットとする既存の Java アプリケーションに直面したらどうなるでしょうか?おそらくコード ベースの大部分は Java をホストしており、再利用したいツールとライブラリの豊富なエコシステムを開発しました。このようなアプリケーション全體を別の言語(yǔ)で書き直すにはコストがかかり、言うまでもなく、靜的タイプセーフやコンパイル時(shí)間の最適化などの機(jī)能を放棄することになります。

少し前、私はまさにこのシナリオに直面しました。Java で書かれた 9 つの AWS Lambda アプリは、コールド スタートで非常に遅くなり、一部のアプリが時(shí)折タイムアウトするほどでした。

問(wèn)題の Lambda は API Gateway の背後に配置され、対応する REST API を呼び出すことで管理タスクに使用されました。この機(jī)能はあまり頻繁に使用されていなかったため、コールド スタートが発生するのは避けられませんでした。ただし、これは重要なサービスではなかったため、これらの Lambda を回収できるかどうかを判斷するための実験には絶好の機(jī)會(huì)でした。

この問(wèn)題に対処するために GraalVM や Quarkus などのフレームワークをうまく使用している開発者に関する他のいくつかのブログ投稿に出會(huì)うまで、それほど時(shí)間はかかりませんでした。そこで私は自分で試してみることにしました。

しかし、そもそもこれらのツールは何なのでしょうか?

GraalVM

要するに、GraalVM は、Java をネイティブ イメージにコンパイルし、Graal JVM を使用して実行できるツールセットが付屬する Java 仮想マシンです。

通常、Java は「Just In Time」(JIT) コンパイラーを利用します。これは、名前が示すように、コードの実行中に最適化とコンパイルを?qū)g行します。 JVM オプティマイザーがプログラムの実行を常に監(jiān)視し、時(shí)間の経過(guò)とともにパフォーマンスの向上につながる微調(diào)整を?qū)g行するため、長(zhǎng)時(shí)間実行されるアプリケーションはこの恩恵を受けます。

これは、アプリケーションが一度インスタンス化され、數(shù)時(shí)間以上実行されることが予想される場(chǎng)合には最適ですが、Kubernetes、AWS Lambda、および Java アプリケーションを迅速に起動(dòng)し、実行することを期待するバッチ ジョブを扱う場(chǎng)合には、あまり良くありません。時(shí)間に敏感な操作と需要に応じた規(guī)模 - 自動(dòng)車愛(ài)好家にとってターボラグといえば。

ここで、GraalVM のネイティブ イメージ機(jī)能が役に立ちます。 JIT コンパイラーを使用する代わりに、コードを事前にコンパイルする (AOT) という非常に異なるアプローチを選択します。靜的コード分析を使用してパイを事前にベイクし、ビルド時(shí)に特定のクラスを事前初期化して、アプリケーション コードが実行されるときにいつでも起動(dòng)できるようにします。

結(jié)果は?非常に高速なコールド スタートにより、アプリの有効期間が短く、すぐに起動(dòng)する必要があるサーバーレス ドメインでネイティブ イメージが非常に機(jī)能します。

注意すべき點(diǎn)の 1 つは、GraalVM は AOT に対応していますが、Java で書かれた GraalVM の新しい JIT コンパイラを考慮すると、既存の JVM のドロップイン置き換えとしても機(jī)能し、パフォーマンスが向上するということです。

しかし、待ってください、それだけではありません!ネイティブ イメージには既知の実行パス上にあるコードのみが含まれるため、脂肪は削除され、保持することが明示的に宣言されていないすべての Java クラスは使用できなくなります。実行が予想されるビットのみを保持するため、アプリケーションのセキュリティが向上します。

ホストを侵害する手段としてリモート コード実行を使用する悪名高い Log4J 脆弱性を例に考えてみましょう。ネイティブ イメージでは、攻撃を伝達(dá)するために必要なライブラリ コードの部分にさえ到達(dá)できないため、ガジェット チェーンが成功する可能性は非常に低いです。

クォーカス

一方、

Quarkus は、サーバーレス アプリケーション用に最適化された Java フレームワークで、AWS Lambda をネイティブ実行可能ファイルとして特別に設(shè)定および構(gòu)築するための拡張機(jī)能を提供することで、ネイティブ イメージの構(gòu)築を容易にするツールボックスが付屬しています。

C1 コンパイラ

Lambda の最適化の過(guò)程で、別の最適化手法にも遭遇しました。そのような最適化の 1 つは、Lambda の実行中に C1 コンパイラーを排他的に使用する提案であり、これによりコールド スタートの高速化が約束されました。通常、JVM 內(nèi)で実行される Java アプリケーションは、高速ではあるが最適性が低い C1 と、その後に低速ではあるが長(zhǎng)時(shí)間実行される Java アプリケーションに最適なパフォーマンスを提供する C2 で構(gòu)成される階層型コンパイルを使用します。 Lambda の壽命が短いことを考えると、C2 コンパイルのメリットはごくわずかです。

AWS Lambda の C1 コンパイルを構(gòu)成するプロセスを説明するガイドは、ここから入手できます。

もちろん、私が実施している GraalVM マスタープランと比較して、この手法がどの程度の改善をもたらすかを知りたかったので、以下の調(diào)査結(jié)果にも含めました。

JVM の階層型コンパイルと GraalVM の新しい JIT コンパイラーの詳細(xì)については、この Baeldung の記事を參照してください。

「でも、ちょっと待って、AWS SnapStart についてはどうですか?」

皮肉なことに、私が変更を本番環(huán)境に出荷してから數(shù)か月後、AWS は最新の SnapStart 機(jī)能を考案しました。これは、実行中の Lambda のスナップショットを取得し、最初から再初期化するのではなく、スナップショット イメージを使用します。復(fù)元ポイントはコールド スタートの高速化を約束します。 GraalVM の使用が無(wú)駄な労力であったかどうかを確認(rèn)するために試してみる必要があり、それも調(diào)査結(jié)果に含めました。

SnapStart を最大限に活用するには、beforeCheckpoint フックと afterRestore フックを利用するためにコードのリファクタリングが必要になることに注意してください (詳細(xì)はこちら)。可能であれば大きなコード変更を避けたかったため、これらのメソッドを?qū)g裝したりコードを再配置したりすることなく、この機(jī)能を「そのまま」使用しました。

マスタープラン

GraalVM に戻りましょう。驚いたことに、このソリューションを組み込んだ後は、ビルド構(gòu)成ファイルといくつかの必要なメタデータの追加と調(diào)整を除いて、Java コードの変更はまったく必要ありませんでした。

うますぎる話ですね?

少しかもしれない。 Java の世界では AOT コンパイルを使用していることを考えると、多くのライブラリが依存するリフレクション、プロキシ、インターフェイス、サービス レジストリなどの言語(yǔ)機(jī)能の使用に関しては、一定の課題が生じます。このため、GraalVM コンパイラでは、特定のクラスとサービスを最終アーティファクトに含めることができるように、明示的に登録する追加の構(gòu)成メタデータを宣言する必要があります。 GraalVM は、実行可能ファイルと一緒に実行するために使用できるいわゆるエージェントを提供し、必要な構(gòu)成を自動(dòng)的に識(shí)別することで、このプロセスを容易にします。

Quarkus は、よく知られているライブラリを「ネイティブ イメージ フレンドリー」にするための拡張機(jī)能をいくつか提供していますが、私が既存のコード ベースで作業(yè)していたことを考えると、私の目標(biāo)は、大きなリファクタリング (または、さらに言えばコードの変更) を避けることでした。 )、ネイティブ イメージを正常に生成するために既存のライブラリに必要な構(gòu)成ファイルを作成することにしました。

ネイティブ イメージのコンパイルはリソースを大量に消費(fèi)し、標(biāo)準(zhǔn)の JVM ランタイムを?qū)澫螭趣筏骏啸ぅ去畅`ドのコンパイルに比べてかなり長(zhǎng)い時(shí)間がかかることに注意してください。メモリ不足の問(wèn)題を回避するために、ビルド ノードにより多くの RAM を割り當(dāng)てる必要がある可能性があります。これは取引を妨げるものではありませんが、必ず念頭に置いておく必要があります。

ネイティブ イメージ Lambda をコンパイルしてパッケージ化したので、次はそれらをテスト環(huán)境にデプロイします。通常、Java Lambda は AWS の Java ランタイムを利用して実行します。ただし、Graal JVM 內(nèi)にラップされたアプリコードを含むバイナリアーティファクトであるネイティブイメージを使用しようとしている場(chǎng)合、AWS が提供する「カスタム」Amazon Linux 環(huán)境の 1 つを選択する必要があります。

テスト方法

Postman API コレクションを使用して 9 個(gè)の Lambda すべてにリクエストを送信し、上記の各手法のコールド スタートの応答時(shí)間を測(cè)定しました。常にコールド スタートが発生することを確認(rèn)するために、ターゲット Lambda の設(shè)定をリロードしました。これにより、次の呼び出しではすでにウォーム狀態(tài)になっている可能性のあるインスタンスが使用されなくなります。すべての Lambda は 1GB の RAM で構(gòu)成されました。また、プロセスに時(shí)間がかかることを考慮して、構(gòu)成ごとに 1 回の呼び出しを測(cè)定しました。ただし、観察された応答時(shí)間は非常に明確な狀況を示しています。

結(jié)果

それで、うまくいきましたか?絶対に!結(jié)果は次のとおりです:

Java Can Be Serverless Too: Using GraalVM for Fast Cold Starts

そして、明らかな勝者は次のとおりです: GraalVM Native Images - 変更されていない Java Lambda と比較して、平均して 3 倍の高速化が実現(xiàn)しました - タイムアウトがなくなり、応答時(shí)間が大幅に向上しました。これはまさに私が望んでいたものです。達(dá)成します。

コードを変更しないと、SnapStart は思ったほどパフォーマンスが良くありませんでした。 SnapStart 機(jī)能に加えて C1 コンパイラを採(cǎi)用すると、コールド スタート時(shí)間はさらに短縮されましたが、それでも GraalVM のネイティブ イメージを上回ることはできませんでした。だからといって、これが迅速かつ簡(jiǎn)単に実裝できる改善策として実行可能な選択肢ではないというわけではありません。ただし、Lambda を可能な限り最適化する必要があり、構(gòu)成とビルド プロセスを調(diào)整するための時(shí)間とリソースがある場(chǎng)合は、パフォーマンスとセキュリティの點(diǎn)で GraalVM が間違いなく優(yōu)れています。

メモリ使用量

GraalVM が主張しているように、ネイティブ イメージは、通常の JVM に比べて効率的に実行するために必要なリソースが少なくなります。これらの Lambda が動(dòng)作する必要がある RAM の量を減らした場(chǎng)合に、コールド スタートとウォーム スタートのパフォーマンスがどのように維持されるかを確認(rèn)したかったのです。今回は、このテストを?qū)g行するために 1 つの Lambda アプリのみを選択しました。結(jié)果は次のとおりです:

Java Can Be Serverless Too: Using GraalVM for Fast Cold Starts

Java Can Be Serverless Too: Using GraalVM for Fast Cold Starts

そして彼らは約束を果たしました!通常の JVM Lambda は 256 MB 以下の構(gòu)成を試行するとメモリ不足になりましたが、ネイティブ イメージは段階的ではなく実行を継続しているように見(jiàn)えました。 128 MB が利用可能な最小メモリ オプションでなかったら、どれだけメモリを減らすことができたのだろうか。ネイティブ イメージは、コールド スタートで高速なだけでなく、限られたリソースで作業(yè)する場(chǎng)合でも一貫したパフォーマンスを提供し、運(yùn)用コストの削減につながります。

結(jié)論

Java のエコシステムは豊富かつ広大で、サーバーレス アプリケーションに関して Java を常に活用し続ける多くの新しいテクノロジと機(jī)能強(qiáng)化が日々登場(chǎng)しています。そのような新興テクノロジーの 1 つが GraalVM です。研究プロジェクトとして始まったものは、現(xiàn)在では徐々に採(cǎi)用されており、HotSpot などの標(biāo)準(zhǔn) JVM の実行可能な代替手段として浮上しています。このブログ投稿では、GraalVM が提供する機(jī)能のほんの表面をなぞっただけなので、読者にはさらに詳しく調(diào)べていただくことをお?jiǎng)幛幛筏蓼埂?Adyen (記事リンク) や Facebook (記事リンク) などの企業(yè)からは、GraalVM を利用して時(shí)間とお金を節(jié)約できた成功事例がいくつかあります。

次に Java をオプションとして無(wú)視する場(chǎng)合は、GraalVM を試してみてください。 Spring Boot 3 がすぐに使える GraalVM ネイティブ イメージをサポートするようになったことで、サーバーレス ワークロードにこれまで以上に簡(jiǎn)単にネイティブ イメージを採(cǎi)用して、GraalVM が提供するパフォーマンス、低リソース消費(fèi)、追加されたセキュリティを活用できるようになりました。

以上がJava もサーバーレスにできる: GraalVM を使用した高速コールド スタートの詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見(jiàn)つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ハッシュマップとハッシュテーブルの違いは? ハッシュマップとハッシュテーブルの違いは? Jun 24, 2025 pm 09:41 PM

ハッシュマップとハッシュテーブルの違いは、主にスレッドの安全性、ヌル価値のサポート、パフォーマンスに反映されます。 1.スレッドの安全性の観點(diǎn)から、ハッシュテーブルはスレッドセーフであり、その方法はほとんど同期メソッドであり、ハッシュマップはスレッドセーフではない同期処理を?qū)g行しません。 2。ヌル値のサポートに関しては、ハッシュマップは1つのnullキーと複數(shù)のヌル値を許可しますが、ハッシュテーブルはnullキーや値を許可しません。 3.パフォーマンスの観點(diǎn)から、ハッシュマップは同期メカニズムがないため、より効率的です。ハッシュテーブルは、各操作のロックパフォーマンスが低いです。代わりにconcurrenthashmapを使用することをお?jiǎng)幛幛筏蓼埂?/p>

なぜラッパークラスが必要なのですか? なぜラッパークラスが必要なのですか? Jun 28, 2025 am 01:01 AM

Javaは、基本的なデータ型がオブジェクト指向の操作に直接參加できないため、ラッパークラスを使用し、実際のニーズでオブジェクトフォームが必要になることが多いためです。 1.コレクションクラスは、リストが自動(dòng)ボクシングを使用して數(shù)値を保存するなど、オブジェクトのみを保存できます。 2。ジェネリックは基本的なタイプをサポートしておらず、パッケージングクラスはタイプパラメーターとして使用する必要があります。 3.パッケージングクラスは、null値を表して、データまたは欠落データを區(qū)別できます。 4.パッケージングクラスは、データの解析と処理を容易にするための文字列変換などの実用的な方法を提供するため、これらの特性が必要なシナリオでは、パッケージングクラスは不可欠です。

インターフェイスの靜的メソッドとは何ですか? インターフェイスの靜的メソッドとは何ですか? Jun 24, 2025 pm 10:57 PM

StaticMethodsinInterfaceswereIntroducatedinjava8toalowutilityは、interfaceitself.beforejava8、そのような導(dǎo)入のために導(dǎo)入されたコード、rediveTodisorgedCode.now、statecmethodssprovidreebenefits:1)彼らの可能性のある測(cè)定di

JITコンパイラはどのようにコードを最適化しますか? JITコンパイラはどのようにコードを最適化しますか? Jun 24, 2025 pm 10:45 PM

JITコンパイラは、メソッドインライン、ホットスポット検出とコンピレーション、タイプの投機(jī)と偏見(jiàn)、冗長(zhǎng)操作の排除の4つの方法を通じてコードを最適化します。 1。メソッドインラインで呼び出しのオーバーヘッドを減らし、頻繁に小さな方法と呼ばれる挿入をコールに直接直接挿入します。 2。ホットスポットの検出と高周波コードの実行とそれを中央に最適化して、リソースを節(jié)約します。 3。タイプ投機(jī)は、敬v的な呼び出しを達(dá)成するためにランタイムタイプ情報(bào)を収集し、効率を向上させます。 4.冗長(zhǎng)操作は、運(yùn)用データの削除に基づいて役に立たない計(jì)算と検査を排除し、パフォーマンスを向上させます。

インスタンスイニシャルイザーブロックとは何ですか? インスタンスイニシャルイザーブロックとは何ですか? Jun 25, 2025 pm 12:21 PM

インスタンス初期化ブロックは、Javaで使用され、コンストラクターの前に実行されるオブジェクトを作成するときに初期化ロジックを?qū)g行します。複數(shù)のコンストラクターが初期化コード、複雑なフィールド初期化、または匿名のクラス初期化シナリオを共有するシナリオに適しています。靜的初期化ブロックとは異なり、インスタンス化されるたびに実行されますが、靜的初期化ブロックはクラスがロードされたときに1回のみ実行されます。

変數(shù)の「ファイナル」キーワードは何ですか? 変數(shù)の「ファイナル」キーワードは何ですか? Jun 24, 2025 pm 07:29 PM

Injava、thefinalkeywordpreventsavariaibleのValue frombeingededafterassignment、ButiTsbehiviordiffersforprimitivesandobjectReferences

工場(chǎng)のパターンとは何ですか? 工場(chǎng)のパターンとは何ですか? Jun 24, 2025 pm 11:29 PM

ファクトリーモードは、オブジェクトの作成ロジックをカプセル化するために使用され、コードをより柔軟でメンテナンスしやすく、ゆるく結(jié)合します。コアの答えは、オブジェクトの作成ロジックを一元的に管理し、実裝の詳細(xì)を隠し、複數(shù)の関連オブジェクトの作成をサポートすることです。特定の説明は次のとおりです。工場(chǎng)モードは、NewClass()の使用を直接回避し、処理のための特別な工場(chǎng)クラスまたは方法にオブジェクトの作成を手渡します。複數(shù)のタイプの関連オブジェクトが作成され、作成ロジックが変更され、実裝の詳細(xì)を非表示にする必要があるシナリオに適しています。たとえば、支払いプロセッサでは、Stripe、PayPal、その他のインスタンスが工場(chǎng)を通じて作成されます。その実裝には、入力パラメーターに基づいて工場(chǎng)クラスによって返されるオブジェクトが含まれ、すべてのオブジェクトは共通のインターフェイスを?qū)g現(xiàn)します。一般的なバリアントには、単純な工場(chǎng)、工場(chǎng)法、抽象的な工場(chǎng)が含まれます。これらは異なる複雑さに適しています。

タイプキャストとは何ですか? タイプキャストとは何ですか? Jun 24, 2025 pm 11:09 PM

変換には、暗黙的で明示的な変換には2つのタイプがあります。 1.暗黙的な変換は、INTを2倍に変換するなど、自動(dòng)的に発生します。 2。明示的な変換には、(int)mydoubleの使用など、手動(dòng)操作が必要です。タイプ変換が必要な場(chǎng)合には、ユーザー入力の処理、數(shù)學(xué)操作、または関數(shù)間のさまざまなタイプの値の渡されます。注意する必要がある問(wèn)題は次のとおりです。浮動(dòng)小數(shù)點(diǎn)數(shù)を整數(shù)に変換すると、分?jǐn)?shù)部分が切り捨てられ、大きなタイプを小さなタイプに変えるとデータの損失につながる可能性があり、一部の言語(yǔ)では特定のタイプの直接変換ができません。言語(yǔ)変換ルールを適切に理解することは、エラーを回避するのに役立ちます。

See all articles