Spring BootとSpring Cloudアプリケーションのメモリを管理する方法は?

メモリ管理

アプリケーションアーキテクチャ全体では、非本番環境では、通常1 GBまたは2 GBのRAMで十分です。このアプリケーションを20個または30個の独立したマイクロサービスに分割すると、RAMが約1 GBまたは2 GBのままであることを期待することは困難です。特にSpring Cloudを使用している場合は。

まず、Eurekaサービス+ REST APIを提供する2つのシンプルなマイクロサービスの3つのサービスを準備し、マイクロサービスをEurekaに登録します。ここで、これらのアプリケーションのメモリ使用量は決して制限されません。

ヒント:単純なSpring Cloudアプリケーションの作成例:https : //www.ictgu.cn/share/6644e468

下の図に示すように、3つのマイクロサービスは、コンピューター上で約1.5 GBのRAMメモリを消費します。これらの3つのサービスは最も単純なアプリケーションであり、基本的にデータ処理は行われません。このようなメモリの消費には、明らかに理想的ではありません。最小RAM使用量は、Eureka
ディスカバリーサービス用であり、最大値は、宣言型クライアントを初期化して他のサービスのAPIを呼び出すためのものです。

無制限のメモリ使用量

メモリ使用量は、JProfilerが作成したチャートに示すとおりです。図に示すように、メモリ使用量はヒープの影響を受けます。ヒープは非ヒープと比較して多くのスペースを消費します。

ヒープ

非ヒープ

もちろん、最初の明白な問題は、ヒープ上でマイクロサービスアプリケーションを実行するためにスペースが必要かどうかです。答えは「いいえ」です。それでは、
Java 8 メモリ管理プロセスを実行する方法を簡単に紹介しましょう

JVMメモリは、ヒープヒープの 2つの部分に分割できます。上の図に示すように、マイクロサーバーのサイズはsize(〜600MB)です。ターンでは、JVMのメモリの若い世代(若い世代)歳(旧世代)のコンポーネント。新しく作成されたオブジェクトはすべて若い世代のものです。若い世代がいっぱいになると、マイナーGCが実行されます。具体的には、若い世代にあるこれらのオブジェクトの一部がエデンスペースになります。マイナーGCは、まだ使用されているすべてのオブジェクトをEden SpaceからSurvivor 0に移動します。サバイバー0とサバイバー1のスペースに対して同じプロセスを実行します。GCで多くのサイクルを生き延びたすべてのオブジェクトは、古い世代のメモリ空間に移動されました。オブジェクトを削除する場所Major GC責任です。次の図をよりよく理解するために、java -jarコマンドを実行するときに、次のパラメーターを使用してJavaヒープのメモリ制限を設定できます。

  • -Xms – JVM起動時の初期ヒープサイズ
  • -Xmx –最大ヒープサイズ
  • -Xmn-若い世代のサイズ。残りのスペースは古い世代です。

JVMメモリ

JVMメモリの2番目の部分は、私たちの観点から見ると、上の図は少し重要ではなく、ヒープではありません。非ヒープには、次の部分が含まれます。

  • スレッドスタック:実行中のすべてのスレッドのためのスペース。-Xssパラメーターを使用して、最大スレッドサイズを設定できます
  • メタスペースPermGemに置き換わります(Java 7はJVMヒープの一部です)。メタスペースでは、すべてのクラスとメソッドがアプリケーションを通じてロードされます。Spring Cloudに含まれるパッケージの数を見ると、ここでは多くのメモリを節約することはしません。メタスペースのサイズは、-XX:MetaspaceSizeおよび-XX:MaxMetaspaceSizeパラメーターを設定することで管理できます。
  • コードキャッシュ:これは、JIT(ジャストインタイム)コンパイラによってネイティブコードにコンパイルされたネイティブコード(JNIなど)またはJavaメソッド用のスペースです。最大サイズ設定-XX:ReservedCodeCacheSizeパラメーター。
  • 圧縮クラススペース-XXを使用:CompressedClassSpaceSizeは、圧縮クラススペース用に予約されている最大メモリに設定されます。
  • 直接NIOバッファー

より簡単に言うと、ヒープはオブジェクト用であり、非ヒープはクラス用です。アプリケーションNon-HeapがHeapよりも大きい場合、この状況を終了できると考えられます。まず、次のパラメーターを使用してサービスディスカバリを実行します。私の意見では、TomcatをSpring Bootに組み込んでEurekaを起動する場合、これらの構成が最も低い値です。

-Xms16m \
-Xmx32m \
-XX:MaxMetaspaceSize=48m \
-XX:CompressedClassSpaceSize=8m \
-Xss256k \
-Xmn8m \
-XX:InitialCodeCacheSize=4m \
-XX:ReservedCodeCacheSize=8m \
-XX:MaxDirectMemorySize=16m

REST APIマイクロサービス(FeignまたはRibbonを使用)を使用する場合、いくつかの値を増やす必要があります。

-Xms16m \
-Xmx48m \
-XX:MaxMetaspaceSize=64m \
-XX:CompressedClassSpaceSize=8m \
-Xss256k \
-Xmn8m \
-XX:InitialCodeCacheSize=4m \
-XX:ReservedCodeCacheSize=8m \
-XX:MaxDirectMemorySize=16m

上記の構成に従って、JProfilerは次のチャートを生成しました。違いは、起動とリクエストの処理時間です。以前の設定と比較して、アプリケーションの実行速度は遅くなります。もちろん、本番環境ではそのようなパラメータを設定しません。

ヒープ

非ヒープ

現在の総メモリ使用量は次のとおりです。マイクロサービスは依然としてメモリフットプリントが最大ですが、ユーレカは最小です。

低い構成メモリ使用量

また、さまざまなWebコンテナーを使用してEurekaアプリケーションを実行しようとしました。pom.xmlファイルに次の依存関係を含めることで、Webコンテナを簡単に変更できます。

Undertowを使用する

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

Jettyを使用する

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

結果のランキング:Undertow(116MB)、Tomcat(122MB)、Jetty(128MB)。
このテストは、マイクロサービスを登録せずに、Eurekaサービスでのみ実行されます。

文末福利

Javaリソースへのリンク:https ://pan.baidu.com/s/1pUCCPstPnlGDCljtBVUsXQパスワード:b2xc
詳細:2020年に選択されたAlibaba Java、アーキテクチャ、マイクロサービスなどに加えて、v❤:qwerdd111

転載、元の住所を守ってください、よろしくお願いします〜

おすすめ

転載: www.cnblogs.com/Alandre/p/12729489.html