一個由-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  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章