GCチューニング——XX:TargetSurvivorRatioの使用

18564 ワード

jmeterを使用してサービスを測定し、スループットを必要とするアプリケーション、2000スレッド、JVMパラメータは以下の通りです.
-Xms4096m 
-Xmx4096m 
-Xss256K 
-XX:MetaspaceSize=128M 
-XX:MaxMetaspaceSize=256M 
-Xmn3g 
-XX:+UseAdaptiveSizePolicy 
-XX:SurvivorRatio=10 
-XX:TargetSurvivorRatio=80 
-XX:+UseParallelGC 
-XX:ParallelGCThreads=16 
-XX:+UseParallelOldGC 
-XX:MaxGCPauseMillis=100 
-XX:+PrintGCDetails 
-XX:+PrintTenuringDistribution 
-Xloggc:gclog.log

パラメータの意味:新生代はPS(Parallel Scavenge)コレクター、旧年代はPO(Serial Old)コレクター、Survivor領域は適応戦略を使用し、旧年代は1024 M、新生代は3072 Mであり、実行後のgcログの一部は以下の通りである.
759.070: [GC (Allocation Failure) 
Desired survivor size 54001664 bytes, new threshold 1 (max 15)
[PSYoungGen: 3077120K->38288K(3091456K)] 3364258K->329282K(4140032K), 0.0254347 secs] [Times: user=0.30 sys=0.01, real=0.02 secs] 
760.813: [GC (Allocation Failure) 
Desired survivor size 52953088 bytes, new threshold 1 (max 15)
[PSYoungGen: 3076496K->41152K(3094016K)] 3367490K->335530K(4142592K), 0.0259776 secs] [Times: user=0.31 sys=0.00, real=0.03 secs] 
762.741: [GC (Allocation Failure) 
Desired survivor size 51904512 bytes, new threshold 1 (max 15)
[PSYoungGen: 3082432K->39072K(3092992K)] 3376810K->336986K(4141568K), 0.0253653 secs] [Times: user=0.30 sys=0.00, real=0.02 secs] 
764.476: [GC (Allocation Failure) 
Desired survivor size 51380224 bytes, new threshold 1 (max 15)
[PSYoungGen: 3080352K->41472K(3095552K)] 3378266K->343266K(4144128K), 0.0259734 secs] [Times: user=0.31 sys=0.00, real=0.03 secs] 
766.346: [GC (Allocation Failure) 
Desired survivor size 50855936 bytes, new threshold 1 (max 15)
[PSYoungGen: 3086336K->39616K(3095040K)] 3388130K->344530K(4143616K), 0.0265471 secs] [Times: user=0.30 sys=0.00, real=0.03 secs]

問題点として、オブジェクトがSurvivor領域に入った後、適応戦略を使用しているため、年齢が1の場合、つまりMinor GCが1回の場合に古い年代に移動され、古い年代のメモリの増加が速すぎ、結果として2000スレッドの圧力の下で、10分でFGCが発生した.
734.611: [Full GC (Ergonomics) [PSYoungGen: 39264K->0K(3102208K)] [ParOldGen: 1044614K->203586K(1048576K)] 1083878K->203586K(4150784K), [Metaspace: 71093K->71084K(1114112K)], 0.4044200 secs] [Times: user=1.56 sys=0.02, real=0.41 secs] 
736.801: [GC (Allocation Failure) 

次に、パラメータを変更します.
-Xms4096m 
-Xmx4096m 
-Xss256K 
-XX:MetaspaceSize=128M 
-XX:MaxMetaspaceSize=256M 
-Xmn3g 
-XX:-UseAdaptiveSizePolicy 
-XX:SurvivorRatio=10 
-XX:TargetSurvivorRatio=80 
-XX:+UseParallelGC 
-XX:ParallelGCThreads=16 
-XX:+UseParallelOldGC 
-XX:MaxGCPauseMillis=100 
-XX:+PrintGCDetails 
-XX:+PrintTenuringDistribution 
-Xloggc:gclog.log

重要なパラメータの説明:
-XX:-UseAdaptiveSizePolicy   Survivor      
-XX:TargetSurvivorRatio=80 Survivor      80%,   50%

実行後にGCログを観察:古い時代はメモリの増分が遅くて遅い
423.288: [GC (Allocation Failure) [PSYoungGen: 2663744K->37488K(2883584K)] 2805561K->179425K(3932160K), 0.0249582 secs] [Times: user=0.27 sys=0.00, real=0.02 secs] 
424.884: [GC (Allocation Failure) [PSYoungGen: 2658928K->39872K(2883584K)] 2800865K->181817K(3932160K), 0.0250108 secs] [Times: user=0.27 sys=0.01, real=0.03 secs] 
426.367: [GC (Allocation Failure) [PSYoungGen: 2661312K->42848K(2883584K)] 2803257K->184817K(3932160K), 0.0259483 secs] [Times: user=0.30 sys=0.00, real=0.02 secs] 
427.911: [GC (Allocation Failure) [PSYoungGen: 2664288K->42464K(2883584K)] 2806257K->184441K(3932160K), 0.0260695 secs] [Times: user=0.29 sys=0.01, real=0.03 secs] 
429.493: [GC (Allocation Failure) [PSYoungGen: 2663904K->42960K(2883584K)] 2805881K->184961K(3932160K), 0.0264706 secs] [Times: user=0.29 sys=0.01, real=0.03 secs] 
431.164: [GC (Allocation Failure) [PSYoungGen: 2664400K->44816K(2883584K)] 2806401K->186985K(3932160K), 0.0263883 secs] [Times: user=0.29 sys=0.00, real=0.03 secs] 
432.723: [GC (Allocation Failure) [PSYoungGen: 2666256K->42016K(2883584K)] 2808425K->184201K(3932160K), 0.0269009 secs] [Times: user=0.29 sys=0.00, real=0.03 secs] 
434.244: [GC (Allocation Failure) [PSYoungGen: 2663456K->42896K(2883584K)] 2805641K->185217K(3932160K), 0.0258802 secs] [Times: user=0.29 sys=0.01, real=0.03 secs] 
435.859: [GC (Allocation Failure) [PSYoungGen: 2664336K->40608K(2883584K)] 2806657K->182937K(3932160K), 0.0253089 secs] [Times: user=0.28 sys=0.01, real=0.02 secs] 
437.329: [GC (Allocation Failure) [PSYoungGen: 2662048K->42304K(2883584K)] 2804377K->184665K(3932160K), 0.0283344 secs] [Times: user=0.29 sys=0.00, real=0.02 secs]