ヒープサイズ設定
分析例1
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
-Xms(初期Javaヒープサイズを設定)-Xmx(最大Javaヒープメモリサイズを設定)-Xss(単一スレッドが占有するスタックサイズ)-Xmn(若い世代のサイズ)
- -Xmsと-Xmxの値が同じ場合、初期化はJavaの最大メモリサイズを制限することです
- ここで最大サイズと若い世代のサイズを設定します。そうすると、残りのメモリサイズが確実に古い年齢に影響します
分析例2
-XX:NewRatio = 4 -XX:SurvivorRatio = 4 -XX:MaxPermSize = 16m -XX:MaxTenuringThreshold = 0
-XX:NewRatio = 4:若い世代のEdenエリアとSurvivorエリアのサイズ比を設定します。4に設定すると、2つのサバイバーディストリクトと1つのエデンディストリクトの比率は2になります。4つのサバイバーディストリクトは、若い世代全体の1/6を占めます。古い世代の比率(永続的な世代を除く)。4に設定すると、若い世代と古い世代の比率は1:4になり、若い世代はスタック全体の1/5を占めます。-XX:SurvivorRatio = 4:永続的な世代のサイズを16mに設定します。-XX:MaxTenuringThresholdは、古い世代にリサイクルした後の世代数を設定します
リサイクル業者の選択
JVMには、シリアルコレクター、パラレルコレクター、コンカレントコレクターの3つのオプションがありますが、シリアルコレクターはデータ量が少ない場合にのみ適しているため、ここで選択するのは主にパラレルコレクターとコンカレントコレクターです。デフォルトでは、JDK5.0は以前にシリアルコレクターを使用していましたが、他のコレクターを使用する場合は、起動時に対応するパラメーターを追加する必要があります。JDK5.0以降、JVMは現在のシステム構成に従って判断します。
スループット優先の並列コレクター
分析例1
java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+ UseParallelGC -XX:ParallelGCThreads = 20
-XX:+ UseParallelGC:ガベージコレクターを並列コレクターとして選択します。この構成は、若い世代にのみ有効です。上記の構成では、若い世代は並行収集を使用しますが、古い世代は引き続きシリアル収集を使用します。-XX:ParallelGCThreads = 20:並列コレクターのスレッド数を構成します。つまり、同時にガベージコレクションされるスレッドの数です。この値は、プロセッサーの数と等しくなるように構成するのが最適です。
分析例2
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+ UseParallelGC -XX:ParallelGCThreads = 20 -XX:+ UseParallelOldGC
-XX:+ UseParallelOldGC:古い世代のガベージコレクションメソッドを並列コレクションとして構成します。JDK6.0は、古い世代と古い世代の並行収集をサポートしています。
分析例3
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+ UseParallelGC -XX:MaxGCPauseMillis = 100 -XX:+ UseAdaptiveSizePolicy
-XX:+ UseAdaptiveSizePolicy:このオプションを設定した後、並列コレクターは、若い世代領域のサイズと対応するSurvivor領域の比率を自動的に選択して、ターゲットシステムによって指定された最小対応時間または収集頻度を達成します。この値は、並列コレクターを使用する場合にお勧めします、常に開いています。
応答時間を優先する並行コレクター
分析例1
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads = 20 -XX:+ UseConcMarkSweepGC -XX:+ UseParNewGC
-XX:+ UseConcMarkSweepGC:同時収集の古い世代を設定します。
分析例2
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+ UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction = 5 -XX:+ UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction:コンカレントコレクタはメモリ領域を圧縮または編成しないため、しばらくすると「断片化」が発生し、操作の効率が低下します。この値は、GCを実行してメモリ領域を圧縮および編成する回数を設定します。-XX:+ UseCMSCompactAtFullCollection:古い世代の圧縮をオンにします。パフォーマンスに影響する可能性がありますが、断片化を解消できます
付属情報
-XX:+ PrintGC:print GC -XX:+ PrintGCDetails:詳細情報 -XX:+ PrintGCApplicationStoppedTime:プログラムが印刷ガベージコレクション中に一時停止された時間。 -Xloggc:filename:上記と組み合わせて使用し、関連するログ情報をファイルに記録して分析します。
たとえば、使用例:
[root @ xx jvm测试]#java -XX:+ PrintGCDetails -Xloggc:jvmLog.txt DynamicDispatch man say hello woman say hello woman say hello [root @ xx jvm测试]#ls 'DynamicDispatch $ Human.class' 'DynamicDispatch $ Woman .class 'DynamicDispatch.java hs_err_pid14941.log StaticResolution.class ' DynamicDispatch $ Man.class 'DynamicDispatch.class hello.jar jvmLog.txt StaticResolution.java [root @ xx jvm测试]#vim jvmLog.txt
補足
GCログを分析する方法
完全なGCログ:
チューニングのまとめ
jvmチューニングのパラメーターは、主に以下の側面からのものです。
- ヒープ設定の調整
- 直列並列コレクターの選択
参考文献
- https://www.iteye.com/blog/unixboy-174173(必見)
- https://www.one-tab.com/page/l6WE1xp_TDyEN5iQNVyOEA