一个由-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收集器,与设置一个较大的新生代,对吞吐量提升有很大帮助。

猜你喜欢

转载自blog.csdn.net/rickiyeat/article/details/78906235