戦略に入る前に、Java アプリケーションのコンテキストにおいて起動時間とメモリ使用量が何を意味するかを理解しましょう。
起動時間とは、Java アプリケーションが開始されてからリクエストを処理できるようになるまでにかかる時間を指します。起動時間を最小限に抑えることは、迅速な導入と可用性が不可欠なアプリケーションにとって非常に重要です。
Java アプリケーションのメモリ フットプリントは、実行中に消費されるメモリの量です。メモリの設置面積が大きいと、特にクラウド環境では、コストの増加と遅延の増加につながる可能性があります。
ここでは、Java アプリケーションの起動時間を短縮するためのさまざまな方法を検討します。
クラス データ共有 (CDS) は、JVM が複数の Java プロセス間で共通のクラス メタデータを共有できるようにする技術で、クラスのロードにかかる時間を短縮します。
例:
java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=classlist -XX:SharedArchiveFile=app-cds.jsa -cp myapp.jar
このコマンドは、事前ロードされたクラスを使用してアプリケーションをより速く起動するために使用できる共有アーカイブを生成します。
CDS を有効にすると、アプリケーションの複雑さに応じて起動時間を約 15% 短縮できます。
GraalVM を使用すると、Java コードをネイティブ バイナリにコンパイルでき、JVM のウォームアップを回避して起動時間を大幅に短縮できます。
GraalVM は、複数の言語をサポートするだけでなく、Java アプリケーションを最適化するための強力な機能も提供する高度な多言語仮想マシンです。 GraalVM の優れた機能の 1 つは、Java アプリケーションをネイティブ バイナリにコンパイルする機能です。このプロセスは Ahead-of-Time (AOT) コンパイルとして知られており、特に起動時間の短縮において、パフォーマンスに大きなメリットをもたらします。
GraalVM のネイティブ イメージ ツールを使用して Java アプリケーションをコンパイルすると、アプリケーション全体とその依存関係および JVM の必要な部分が単一のネイティブ実行可能ファイルにコンパイルされます。この実行可能ファイルは、バイトコードを解釈するために Java 仮想マシン (JVM) を必要とせずに、オペレーティング システム上で直接実行できます。
例:
java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=classlist -XX:SharedArchiveFile=app-cds.jsa -cp myapp.jar
このコマンドはアプリケーションをネイティブの実行可能ファイルに変換し、ほぼ瞬時に起動します。
GraalVM ネイティブ イメージを使用すると、起動時間を最大 90% 短縮できますが、すべての Java 機能がサポートされているわけではないため、徹底的なテストが必要です。
AOT コンパイルでは、アプリケーションを実行する前に、事前に Java バイトコードをネイティブ マシン コードに変換します。このプロセスでは、コンパイルされたマシン コードと必要なランタイム コンポーネントを含む実行可能バイナリが生成されます。目標は、アプリケーションの起動時および実行時の JIT コンパイルの必要性を排除または最小限に抑えることです。
AOT コンパイル プロセス中に、Java コンパイラーまたは GraalVM のネイティブ イメージなどの特殊なツールが Java ソース コードからネイティブ実行可能ファイルを生成します。このネイティブ コードはアプリケーションを直接実行するために使用され、JVM がオンザフライで JIT コンパイルを実行する必要がなくなります。
例:
native-image -jar myapp.jar
このコマンドは特定のメソッドをプリコンパイルし、JIT コンパイルにかかる時間を短縮します。
AOT は、特に複雑な初期化シーケンスを持つアプリケーションの場合、起動時間を約 10% 短縮できます。
クラスパス内のクラスとライブラリの数を減らすことも、起動時間の短縮につながる可能性があります。
例 : jlink などのツールを使用してカスタム JRE を作成します。
java -XX:+UnlockExperimentalVMOptions -XX:AOTLibrary=./myapp.so -cp myapp.jar
このカスタム JRE にはアプリケーションに必要なモジュールのみが含まれているため、オーバーヘッドが削減されます。
この最適化により、不要なクラスのロードが排除され、起動時間が 5 ~ 10% 短縮されます。
メモリ フットプリントの削減は、特にリソースが使用量に基づいて課金されるクラウド環境において、アプリケーションをスケーリングするために非常に重要です。
G1 ガベージ コレクターは、一時停止時間を最小限に抑えるように設計されており、ライブ オブジェクトを圧縮することでメモリ使用量を削減できます。
例
jlink --module-path $JAVA_HOME/jmods --add-modules java.base,java.sql --output custom-jre
このコマンドは、最適化されたヒープ設定で G1 GC を使用するように JVM を構成します。
G1 GC は、大量のライブ データを含むアプリケーションでメモリ フットプリントを最大 30% 削減できます。
ヒープ サイズ、スタック サイズ、メタスペースなどの JVM メモリ設定を調整すると、メモリ フットプリントを大幅に削減できます。
例:
java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=classlist -XX:SharedArchiveFile=app-cds.jsa -cp myapp.jar
このコマンドは、メモリ消費を削減するためにヒープとメタスペースの設定を微調整します。
慎重にメモリをチューニングすると、メモリ使用量を 20 ~ 30% 削減できます。
JVM は重複した文字列を検出し、コピーを 1 つだけメモリに保存できるため、アプリケーションが多数の同一の文字列を使用する場合にスペースを節約できます。
例:
native-image -jar myapp.jar
このコマンドは文字列の重複排除を有効にし、重複する文字列が多数存在する場合のメモリ使用量を削減します。
文字列の重複排除により、特にテキストの多いアプリケーションでメモリ使用量を最大 10% 削減できます。
オブジェクトを過剰に作成すると、メモリ使用量が増大する可能性があります。オブジェクト プールまたは不変オブジェクトを使用して、不必要な割り当てを最小限に抑えます。
例:
java -XX:+UnlockExperimentalVMOptions -XX:AOTLibrary=./myapp.so -cp myapp.jar
このシングルトン パターンにより、アプリケーションのライフサイクル中に作成されるオブジェクトの数が削減されます。
オブジェクトの作成を減らすと、アプリケーションの構造に応じてメモリ使用量を 10 ~ 20% 削減できます。
Java アプリケーションの起動時間とメモリ フットプリントを最適化すると、パフォーマンスが大幅に向上し、コストが削減されます。ここで説明した戦略 (CDS の有効化、GraalVM の使用、AOT コンパイル、メモリ チューニングなど) を実装することで、望ましい起動時間の 60% 削減とメモリ使用量の 50% 削減を達成できます。これらの最適化は、クラウド プラットフォームのようなリソースに制約のある環境で特に効果的です。
すべてのアプリケーションは固有であるため、これらの戦略を特定の環境でテストして、期待どおりの結果が得られることを確認することが重要であることに注意してください。
これらのテクニックについてご質問がある場合、またはさらに詳しい説明が必要な場合は、お気軽に以下にコメントを残してください。
投稿の詳細については、 をご覧ください: Java アプリの起動時間とメモリ使用量を最大 60% 削減する戦略
以上がJava アプリの起動時間とメモリ使用量を最大で削減する戦略の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。