JDK16 GA がリリースされてからかなり経ちますが、ほとんどの本番環境では依然として JDK8 が実行されていることは確かです。ここで一言言わなければなりません: JDK8 yyds。 JDK8 が稼働しているため、本番環境のガベージ コレクターは基本的に次の 3 つになります。
デフォルトのガベージコレクターこの記事では、CMS をガベージ コレクターとして使用する、より合理的な JVM パラメータを構成する方法にのみ焦点を当てます。まず最初に言っておきたいのは、JDK8 が CMS を使用する場合、使用するデフォルトのガベージ コレクターは ParallelGC であるため、明示的に宣言する必要があるということです。デフォルトで使用されるガベージ コレクターを確認するにはどうすればよいでしょうか?とても簡単です。次のコードを実行するだけです。
次に、JVM パラメータを構成します。
数秒間実行した後、JVM プロセスを強制的に停止し、コンソールに次のログが表示されます。これは、JDK8 で使用されるデフォルトのガベージ コレクターが ParallelGC であることを証明しています。
または、次の情報から、デフォルトのガベージ コレクターが ParallelGC であることを知ることができます。 CMS の使用次に、著者は、CMS ガベージ コレクターをさまざまな観点から使用するための、より適切な JVM パラメータを構成する方法を紹介します。 ディスプレイ宣言CMS ガベージ コレクターを CMS+parNew として明示的に宣言するのは非常に簡単です。次の 2 つの JVM パラメータを追加するだけです。
このとき、上記のコードを再度実行すると、以下の情報が得られます。下の図からわかるように、この時点で若い世代は ParNew を使用し、古い世代は CMS (concurrent mark-sweep) を使用します。 CMS を明示的に宣言することは、CMS を使用するための最初のステップにすぎません。まだ実行する必要がある最適化が多数あり、構成を待っている JVM パラメータも多数あります。 ヒープサイズ 次に、最も重要なことは、若い世代と古い世代の大きさを宣言することです。 CMS+ParNewを使用しているため。 CMS + ParNew の組み合わせで発生する FGC では MSC アルゴリズムとシングルスレッド リカバリが使用されるため、ヒープ サイズは 8G を超えず、できれば 6G 以内にすることをお勧めします。ヒープメモリが大きい場合、FGC 中の STW 時間は非常に長くなります。ここで著者は 4G を例に挙げています。この時点で、いくつかの JVM パラメータを追加すると、次の構成が得られます。ここで私が設定した若い世代は約 1.5G、古い世代は約 2.5G です。これは比較的妥当な比率です。 JVM パラメータがこのように一致していても GC 状況がまだあまり良くない場合は、ビジネス特性に基づいて特別なチューニングを実行する必要がある可能性があります。
スレッドスタック JDK8 のデフォルトのスレッド スタック サイズは 1M ですが、これは少し大きいです。私の経験では、ほとんどのマイクロサービス プロジェクトは 512k または 256k に調整できます (私のプロジェクトは 256k ですが、問題なく動作します)。
古いリサイクル敷居 CMS が設定されているので、次の 2 つのパラメータを追加する必要があります。なぜこれら 2 つの JVM パラメータを追加する必要があるのでしょうか?これは、CMS の収集条件が非常に複雑であるためです。 CMSInitiatingOccupancyFraction と UseCMSInitiatingOccupancyOnly を使用して、古い世代が 75% に達した場合にのみコレクションを制限しないと (このしきい値は特定の状況に応じて適切に調整できます)、オンラインで CMS GC が発生した場合に原因を突き止めるのが難しくなります。
CMS GC トリガー条件に関連する推奨記事 - [CMS GC トリガー条件の JVM ソースコード解釈]: https://mp.weixin.qq.com/s/Mu-Xz4CLgdxJhcMJ7aKAHg メタデータスペース マイクロサービス アーキテクチャの場合、ほとんどのアプリケーションでは 128 MB のメタデータで十分です。ただし、JDK8 のメタデータ領域は指定されたサイズに初期化されません。代わりに、メタデータ スペースは必要に応じて拡張されます。したがって、256M を設定できます。これら 2 つのパラメータが設定されていない場合、メタデータ スペースのデフォルトの初期化サイズは 20 MB をわずかに超えるだけであり、アプリケーションの起動時にメタスペースが拡張されると FGC が発生します。
ダンプパス 以下の 2 つのパラメータを設定します (HeapDumpPath パラメータで指定するパスは事前に作成しておく必要があり、JVM はダンプ ファイルを生成するときにこのディレクトリを作成できないことに注意してください)。 JVM メモリによって JVM プロセスが終了すると、次のディレクトリにダンプ ファイルが自動的に生成されます。
GCログ これは必須です。そうしないと、オンライン環境での GC の問題のトラブルシューティングが難しくなります。また、loggc が配置されているディレクトリ (/data/log/gclog/) はダンプ パスと同じであり、事前に作成する必要があります。 JVM はこのディレクトリを自動的に作成できません:
圧縮 CMS GC は、圧縮アルゴリズムではなく、マークアンドスイープ アルゴリズムを使用する同時実行ガベージ コレクターであることは誰もが知っています。つまり、時間が経つにつれて断片化が増加し、最終的に JVM がメモリ圧縮アクションをトリガーすることになります。では、メモリはいつデフラグすべきでしょうか?それは次の 2 つのパラメータと大きく関係しています。最初のパラメータはこの機能を有効にするためのもので、2 番目のパラメータはメモリの圧縮 (コンパクション) の前に非圧縮メモリの FGC が何回発生する必要があるかを示します。 CMS GC は FGC ではありません。 CMS GC が処理できない場合 (同時モード障害など)、完全な STW だが圧縮されていない FGC (NoCompactFGC という名前であると想定) がトリガーされるか、完全な STW と圧縮された FGC (CompactFGC という名前であると想定) がトリガーされます。したがって、このパラメータは、CompactFGC がトリガーされる前に連続して何回 NoCompactFGC がトリガーされるかを意味します。途中で CMS GC が発生した場合は、NoCompactFGC の発生回数を再計算する必要があります。
CMS リサイクル条件に関する推奨記事 - [JVM ソースコード解釈: CMS はいつフル GC を実行するか]: https://mp.weixin.qq.com/s/zn3-9e7ZZ7skLo1XDL0xww ここで指定されている設定は実際にはデフォルト値であり、CMS GC が処理に失敗するたびに CompactFGC がトリガーされます。これら 2 つのパラメータは理解するのが困難です。このため、いくつか例を挙げてみたいと思います。 GC モードには CMS GC、NoCompactFGC、CompactFGC の 3 つがあると仮定します (以下を参照)。
NoCompactFGC は、メモリを圧縮せず、Mark-Sweep アルゴリズムを使用する FGC です。 CompactFGC は、メモリを圧縮し、Mark Sweep Compact アルゴリズムを使用する FGC です。 -XX:CMSFullGCsBeforeCompaction=3 を設定すると、次のようになります。
もう1つ 最後に、以下に示すように、CMS と組み合わせると非常に便利な JVM パラメータをお勧めします。このパラメータの正式な説明は次のとおりです: System.gc() 要求は同時コレクションを呼び出し、このような同時 gc サイクル中にクラスもアンロードします (UseConcMarkSweepGC の場合にのみ有効)。この文は次のように要約できます: 1. CMS を使用する場合にのみ機能します。 2. System.gc() が呼び出されると、リサイクルに CMS 並列ガベージ コレクターが使用されます (たとえば、オフヒープ メモリ操作に DirectByteBuffer が頻繁に使用される場合、オフヒープ メモリをリサイクルするには FGC が必要です。このパラメーターを使用すると、元々 FGC を必要としていたものを CMS GC で処理できるようになります)。 3. 並列ガベージ コレクターを呼び出すだけでなく、クラスをアンロードすることもできます。
最後に、完全な JVM パラメータ構成は次のようになります (このパラメータは、私が以前担当していたマイクロサービス プロジェクトで数年間実行されており、単一マシンの同時実行数は 1000 を超え、CMS GC は 8 日に 1 回程度です)。
最後に、JVM パラメータを検証するための優れた Web サイト https://opts.console.heapdump.cn/ を紹介します。ここでは、「パラメータ チェック」を使用できます。しかし、本を盲目的に信じるよりも読まない方が良いということに留意すべきです。当ウェブサイトの検証結果は参考値です。これらが本番環境と完全に一致しているかどうかは状況によって異なります。結局のところ、JVM のチューニングは簡単な作業ではありません。 この記事はWeChatの公開アカウント「A Fei's Blog」から転載したものです。下のQRコードからフォローできます。この記事を転載する場合は、A Fei のブログ公開アカウントにご連絡ください。 |
<<: サービス効率を向上させるにはどうすればよいでしょうか? Ruiyun Service Cloudはテクノロジーを活用して産業用ロボット業界を強化します
>>: ハードウェアの観点から見たエッジコンピューティングとは何ですか?
最近、「 B2B マーケティング戦略レポート」に掲載された一連のデータを見たのですが、それによると、...
Baidu 緑大根アルゴリズムの導入から 1 か月が経ちました。Baidu 緑大根アルゴリズムが徐々...
最近、HUAWEI CONNECT 2018 で、HUAWEI Cloud は完全なパブリック クラ...
10月20日、ダブルイレブンの戦いは20日以上も前に始まりました。その日、魏亜と李佳琦のライブ放送ル...
現在、「クラウドネイティブ」という概念が世界を席巻しています。特にデジタル経済の急速な発展と拡大に伴...
RIPE NCC のメンバーであるリトアニア企業 (Melbikomas UAB、設立年不明、登録年...
2018年上半期の中国モバイルインターネット産業の発展に関する分析レポートキーワード: 安全、上場、...
【概要】当社のウェブサイトの速度を低下させている原因は何ですか? HTTP プロトコルパフォーマンス...
[[206995]]著名な市場調査会社ガートナーが発表したレポートによると、2020年までに世界のク...
Megalayerは、香港サーバー(オプション:CN2/直結/国際回線)、シンガポールサーバー(オプ...
クラウド コンピューティングのこの次の大きな側面は、企業の IT ユーザーに多くの利点をもたらします...
コンテンツの最適化は、今日でも SEO 活動の最も重要な焦点です。ウェブサイトやブログにコンテンツを...
クラウド移行が企業のビジネスに力を与える科学技術の急速な発展と世界を席巻するデジタル変革の波により、...
クラウド コンピューティングは進化を続ける科学であり、クラウド コンピューティングのビジネス上の利点...
ホストキャットのサイトの記事の下に、XXのVPSのCPUがものすごく弱くて、スコアの実行やコンパイル...