一个由-XX:SurvivorRatio失效引发的探索
Posted ZhiYuanYe
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个由-XX:SurvivorRatio失效引发的探索相关的知识,希望对你有一定的参考价值。
最近死磕一个关注吞吐量的应用程序,初期参数如下:
-Xms4096m
-Xmx4096m
-Xss256K
-XX:PermSize=128m
-XX:MaxPermSize=256m
-Xmn3g
-XX:SurvivorRatio=4
-XX:+UseParallelGC
-XX:ParallelGCThreads=16
-XX:+UseParallelOldGC
-XX:MaxGCPauseMillis=100
-XX:+UseAdaptiveSizePolicy
-XX:+PrintGCDetails
-Xloggc:gclog.log
其中,我将新生代大小设置为3G,Survivor区与from/to区比例设置为4,所以计算得出from/to其中一个的大小为512M,但是在执行命令jmap -heap pid的时候,如下所示:
Debugger attached successfully.
Server compiler detected.
JVM version is 25.121-b13
using thread-local object allocation.
Parallel GC with 16 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 4294967296 (4096.0MB)
NewSize = 3221225472 (3072.0MB)
MaxNewSize = 3221225472 (3072.0MB)
OldSize = 1073741824 (1024.0MB)
NewRatio = 2
SurvivorRatio = 4
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 3213885440 (3065.0MB)
used = 2467054208 (2352.7662353515625MB)
free = 746831232 (712.2337646484375MB)
76.76235678145392% used
From Space:
capacity = 3670016 (3.5MB)
used = 2850816 (2.71875MB)
free = 819200 (0.78125MB)
77.67857142857143% used
To Space:
capacity = 3670016 (3.5MB)
used = 0 (0.0MB)
free = 3670016 (3.5MB)
0.0% used
PS Old Generation
capacity = 1073741824 (1024.0MB)
used = 128621512 (122.66303253173828MB)
free = 945120312 (901.3369674682617MB)
11.978811770677567% used
32603 interned Strings occupying 3739840 bytes.
上面的From区和to区的大小只有几M???什么情况?
原来,在HotSpot VM里,并行系的收集器(UseParallelGC / UseParallelOldGC)默认开启-XX:+UseAdaptiveSizePolicy, 这个配置会在每次Minor GC之后对From和To区进行自适应分配大小,而SurvivorRatio使用默认值8,设置成任何非8的数值都会无效。所以,我这个参数里面的-XX:+UseAdaptiveSizePolicy其实是画蛇添足了。
如果既想用ParallelScavenge收集器,又想自己按照应用特点来设置From和To区大小,需要手动:
-Xms4096m
-Xmx4096m
-Xmn3g
-XX:SurvivorRatio=4
-XX:+UseParallelOldGC
-XX:PrintGCDateStamps
-XX:+PrintGCDetails
-XX:-UseAdaptiveSizePolicy
-XX:+PrintAdaptiveSizePolicy
反复调整-XX:SurvivorRatio,直到GC数最少就行了,也可以对每次-XX:+PrintAdaptiveSizePolicy 动态调整的值取一个合适的值。
最后总结下,运用并行GC收集器,与设置一个较大的新生代,对吞吐量提升有很大帮助。
以上是关于一个由-XX:SurvivorRatio失效引发的探索的主要内容,如果未能解决你的问题,请参考以下文章
JVM -XX:NewRatio-XX:SurvivorRatio参数含义
JVM调优系列----NewRatio与SurvivorRatio