アプリケーションアーキテクチャ全体では、非本番環境では、通常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メモリの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
転載、元の住所を守ってください、よろしくお願いします〜