最近死磕一個關注吞吐量的應用程序,初期參數如下:
-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