この記事は各コレクタのチューニングパラメータを簡単に説明することを目的としていますので、漏れがあればご指摘ください。
1.JDKのバージョン
以下の最適化はすべて JDK8 バージョンに基づいています。下位バージョンを JDK8 にアップグレードし、可能な限り update_191 以降のバージョンを使用することを強くお勧めします。
2.ガベージコレクターの選び方
応答優先アプリケーション: 応答時間に敏感な C 側アプリケーションの場合、ヒープ メモリが 8G を超える場合は G1 を選択し、ヒープ メモリが小さいか JDK のバージョンが低い場合は CMS を選択することをお勧めします。
スループット優先アプリケーション: 応答時間の影響を受けず、高スループットを目標とするアプリケーション (MQ、ワーカーなど) には、ParallelGC を選択することをお勧めします。
3. 各コレクタのパラメータを最適化する
1) 基本パラメータ設定 (すべてのアプリケーションとすべてのコレクタに必要):
-Xmx (通常はコンテナー メモリの 50%)
-Xms (Xmx と一致)
-XX:MetaspaceSize(通常256M~512M)
-XX:ParallelGCThreads=コンテナコアの数
-XX:CICompilerCount=コンテナコアの数 (2 以上である必要があります)
2)パラレルGC
上記のパラメーターに加えて、通常は追加のチューニングは必要ありません (JDK8 のデフォルト コレクター)
3)CMS
-XX:+UseConcMarkSweatGC
-Xmn (通常はヒープ メモリの 3 分の 1)、特に設定後は ParallelGCThreads を設定する必要があります。
-XX:ConcGCThreads=n (デフォルトは ParallelGCThreads/4 ですが、状況に応じて ParallelGCThreads/2 に調整できます)
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70 (推奨値)
4)G1
-XX:+G1GC を使用する
-XX:ConcGCThreads=n (デフォルトは ParallelGCThreads/4 ですが、状況に応じて ParallelGCThreads/2 に調整できます)
-XX:G1HeapRegionSize=8m (ヒープ メモリが 8G 以内で、大きなオブジェクトが多い場合は、この値を設定することをお勧めします)
※-XmnとXX:NewRatioを設定しないように注意してください。
5) その他のチューニングパラメータ
-XX:+ParallelRefProcEnabled GC 中の Reference 処理時間が長い場合 (たとえば、多数の WeakReference オブジェクトが使用される場合)、このパラメータを通じて並列処理を有効にすることができます。
4. GC ログをオンにする
-XX:+PrintGC詳細
-XX:+PrintGCDateStamps
-Xloggc:/export/Logs/gc.log
5. GCが正常かどうかの判断方法
1) GC の頻度: YoungGC の頻度は通常数十秒、FullGC の頻度は通常 1 日に数回です。FullGC は G1 リサイクラーに表示されないことに注意してください。
2) GC 消費時間: 消費時間は主にヒープ メモリのサイズとガベージ オブジェクトの数によって決まります。通常、YoungGC 時間は数十ミリ秒、FullGC 時間は数百ミリ秒になります。
3) GC メモリが毎回低下するかどうか: アプリケーションを開始したばかりの場合、YoungGC メモリは毎回低い水位にリサイクルされる必要がありますが、時間が経過するにつれて、古い世代が徐々に増加し、メモリの水位が徐々に低下します。 FullGC/MixedGC (G1) まで上昇すると、メモリは再び下限ウォーターマークに戻ります。そうしないと、メモリ リークが発生する可能性があります。
4) ParallelGC を使用する場合、ヒープ メモリが使い果たされた場合にのみ FullGC がトリガーされるため、ヒープ メモリ使用量アラームを設定する必要はありませんが、GC 頻度に注意する必要があります。
5) JVM 構成の一部は Taishan で検査できます。
著者: 京東リテール 王立輝
出典: JD Cloud 開発者コミュニティ