JVM設置Young Gen的大小疑問
設置年輕代的3組參數有優先級區別
設置Young Generation的大小(假設設爲1024m),彷佛有不少參數,大概分爲3組:
(1)-XX:NewSize=1024m和-XX:MaxNewSize=1024m;
(2)-Xmn1024m;
(3)-XX:NewRatio=2; (假設Heap總共是3G)
很奇怪,爲何hotspot的JVM設置Young Gen會冒出這麼多組參數呢?難道是歷史緣由麼?若是這樣的話,咱們3組混合着用,誰覆蓋誰呢???
筆者找了些資料,也作了些實驗,得出一下結論:
(1)最高優先級: -XX:NewSize=1024m和-XX:MaxNewSize=1024m
(2)次高優先級: -Xmn1024m (默認等效效果是:-XX:NewSize==-XX:MaxNewSize==1024m)
(3)最低優先級:-XX:NewRatio=2
推薦使用的是-Xmn參數,緣由是這個參數很簡潔,至關於一次性設定NewSize和MaxNewSIze,並且二者相等。-Xmn配合-Xms堆起始大小和-Xmx堆最大大小,剛好把堆內存佈局肯定完了(估計設計者也是由於簡潔的緣由,弄出了三個簡寫參數)。另外,官文彷佛說-Xmn是1.4纔開始支持的,可是現在應該沒有還在用1.4以前的JRE的吧。
官文佐證
摘要1: 1.4以後,-Xmn以一抵二(-XX:NewSize和-XX:MaxNewSize)
http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_pause
you can adjust the size of the eden (young generation space) with -XX:NewSize=... and -XX:MaxNewSize=... (for 1.3/1.4) or -Xmn in 1.4 and later.
在1.3/1.4版本下,經過-XX:NewSize和-XX:MaxNewSize兩個參數共同設置Young Gen的大小(原文籠統地把Young Gen當作Eden了)。
而後在1.4以後的版本,能夠直接經過-Xmn來設置Young Gen的大小了。
筆者感受:1.4後,設置Young Gen更方便了。
摘要2:1.4以後,還能夠用-XX:NewRatio,-XX:MaxNewSize覆蓋-XX:NewRatio
If you currently invoke with something like:
-Xms384m -Xmx384m -XX:NewSize=128m -XX:MaxNewSize=128m
which will dedicate 1/3rd of the memory to eden.
For 1.3, MaxNewSize is set to 32mb on Sparc, 2.5mb on Intel based machines. NewRatio (the ratio between the young/old generations) has values of 2 on Sparc Server, 12 on client Intel, and 8 everywhere else, as you can quickly determine, this is superseded by MaxNewSize's defaults (rendering NewRatio ineffective for even moderately sized heaps). I
In 1.4 and later, MaxNewSize has been effectively set to infinity, and NewRatio can be used instead to set the value of the new generation. Using the above as an example, you can do the following in 1.4 and later:
-Xms384m -Xmx384m -XX:NewRatio=2
筆者感受:設置Young Gen有多個參數,大概跟歷史版本緣由有關係。不用去了解這些,須要瞭解的是這些參數一塊兒用的時候,怎麼辦???作實驗瞅瞅!!!
實驗佐證
實驗代碼
public class JVMNewSize {
public static void main(String[] args) {
while(true) {
System.out.println("running ...");
try {
Thread.sleep(1000L*30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
實驗1:-Xmn以一抵二
[@zw_83_83 test]# java -Xms900m -Xmx900m -Xmn600m JVMNewSize
running ...
固定堆內存爲900m,-Xmn指定Young Gen爲600m。
[@zw_83_83 ~]# jps -m
5705 Jps -m
5681 JVMNewSize
[@zw_83_83 ~]# jmap -heap 5681
Attaching to process ID 5681, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.1-b02
using thread-local object allocation.
Parallel GC with 13 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 943718400 (900.0MB) 最大堆內存是900m
NewSize = 629145600 (600.0MB)
MaxNewSize = 629145600 (600.0MB) Young 的確是600m
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
Heap Usage:
PS Young Generation 年輕代:Eden+From+To 總共剛好是600m
Eden Space:
capacity = 471859200 (450.0MB)
used = 9437200 (9.000015258789062MB)
free = 462422000 (440.99998474121094MB)
2.000003390842014% used
From Space:
capacity = 78643200 (75.0MB)
used = 0 (0.0MB)
free = 78643200 (75.0MB)
0.0% used
To Space:
capacity = 78643200 (75.0MB)
used = 0 (0.0MB)
free = 78643200 (75.0MB)
0.0% used
PS Old Generation 年輕代佔用了600m,天然老年代就300m
capacity = 314572800 (300.0MB)
used = 0 (0.0MB)
free = 314572800 (300.0MB)
0.0% used
PS Perm Generation
capacity = 21757952 (20.75MB)
used = 2606792 (2.4860305786132812MB)
free = 19151160 (18.26396942138672MB)
11.980870258377259% used
若是調整爲-Xmn400呢?
[@zw_83_83 test]# java -Xms900m -Xmx900m -Xmn400m JVMNewSize
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 943718400 (900.0MB)
NewSize = 419430400 (400.0MB)
MaxNewSize = 419430400 (400.0MB)
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
實驗2:-Xmn被-XX:NewSize和-XX:MaxNewSize覆蓋
一、 只覆蓋NewSize:儘管NewSize的值被覆蓋了,可是實際空間彷佛沒被覆蓋
[@zw_83_83 test]# java -Xms900m -Xmx900m -Xmn400m -XX:NewSize=200m JVMNewSize
running ...
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 943718400 (900.0MB)
NewSize = 209715200 (200.0MB) NewSize被覆蓋爲200m
MaxNewSize = 419430400 (400.0MB)
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
Heap Usage:
PS Young Generation 年輕代加起來是400m,不是200m (實際分配空間沒覆蓋)
Eden Space:
capacity = 314572800 (300.0MB)
used = 6291472 (6.0000152587890625MB)
free = 308281328 (293.99998474121094MB)
2.000005086263021% used
From Space:
capacity = 52428800 (50.0MB)
used = 0 (0.0MB)
free = 52428800 (50.0MB)
0.0% used
To Space:
capacity = 52428800 (50.0MB)
used = 0 (0.0MB)
free = 52428800 (50.0MB)
0.0% used
PS Old Generation
capacity = 524288000 (500.0MB)
used = 0 (0.0MB)
free = 524288000 (500.0MB)
0.0% used
PS Perm Generation
capacity = 21757952 (20.75MB)
used = 2606792 (2.4860305786132812MB)
free = 19151160 (18.26396942138672MB)
11.980870258377259% used
二、 只覆蓋MaxNewSize
[@zw_83_83 test]# java -Xms900m -Xmx900m -Xmn300m -XX:MaxNewSize=400m JVMNewSize
running ...
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 943718400 (900.0MB)
NewSize = 314572800 (300.0MB)
MaxNewSize = 419430400 (400.0MB) 數值被覆蓋爲400m了
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
Heap Usage:
PS Young Generation 實際年輕代累加也是覆蓋的400,感受是取Max值。
Eden Space:
capacity = 314572800 (300.0MB)
used = 6291472 (6.0000152587890625MB)
free = 308281328 (293.99998474121094MB)
2.000005086263021% used
From Space:
capacity = 52428800 (50.0MB)
used = 0 (0.0MB)
free = 52428800 (50.0MB)
0.0% used
To Space:
capacity = 52428800 (50.0MB)
used = 0 (0.0MB)
free = 52428800 (50.0MB)
0.0% used
PS Old Generation
capacity = 524288000 (500.0MB)
used = 0 (0.0MB)
free = 524288000 (500.0MB)
0.0% used
PS Perm Generation
capacity = 21757952 (20.75MB)
used = 2606792 (2.4860305786132812MB)
free = 19151160 (18.26396942138672MB)
11.980870258377259% used
三、 兩個都覆蓋
[@zw_83_83 test]# java -Xms900m -Xmx900m -Xmn100m -XX:NewSize=200m -XX:MaxNewSize=400m JVMNewSize
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 943718400 (900.0MB)
NewSize = 209715200 (200.0MB)
MaxNewSize = 419430400 (400.0MB)
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
Heap Usage:
PS Young Generation 按NewSize和MaxNewSize的最大值分配
Eden Space:
capacity = 314572800 (300.0MB)
used = 6291472 (6.0000152587890625MB)
free = 308281328 (293.99998474121094MB)
2.000005086263021% used
From Space:
capacity = 52428800 (50.0MB)
used = 0 (0.0MB)
free = 52428800 (50.0MB)
0.0% used
To Space:
capacity = 52428800 (50.0MB)
used = 0 (0.0MB)
free = 52428800 (50.0MB)
0.0% used
PS Old Generation
capacity = 524288000 (500.0MB)
used = 0 (0.0MB)
free = 524288000 (500.0MB)
0.0% used
PS Perm Generation
capacity = 21757952 (20.75MB)
used = 2606792 (2.4860305786132812MB)
free = 19151160 (18.26396942138672MB)
11.980870258377259% used
實驗3:-XX:NewRatio單獨設置有效
[@zw_83_83 test]# java -Xms900m -Xmx900m -XX:NewRatio=2 JVMNewSize
running ...
NewRatio的定義是:New/Old=1:NewRatio
因此,NewRatio是2的話,New佔1/3的Heap,也就是300m了。
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 943718400 (900.0MB)
NewSize = 1310720 (1.25MB) 設置NewRatio並不影響NewSize和MaxNewSize的數值,可是影響分配。
MaxNewSize = 17592186044415 MB 此時MaxNewSize的確是默認值無窮大
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
Heap Usage:
PS Young Generation 新生代加起來的確是300m
Eden Space:
capacity = 235929600 (225.0MB)
used = 4718608 (4.5000152587890625MB)
free = 231210992 (220.49998474121094MB)
2.0000067816840277% used
From Space:
capacity = 39321600 (37.5MB)
used = 0 (0.0MB)
free = 39321600 (37.5MB)
0.0% used
To Space:
capacity = 39321600 (37.5MB)
used = 0 (0.0MB)
free = 39321600 (37.5MB)
0.0% used
PS Old Generation
capacity = 629145600 (600.0MB)
used = 0 (0.0MB)
free = 629145600 (600.0MB)
0.0% used
PS Perm Generation
capacity = 21757952 (20.75MB)
used = 2606792 (2.4860305786132812MB)
free = 19151160 (18.26396942138672MB)
11.980870258377259% used
[@zw_83_83 test]# java -Xms900m -Xmx900m -XX:NewRatio=8 JVMNewSize
running ...
NewRatio=8,則New佔1/9,也就是100m
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 943718400 (900.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 17592186044415 MB
OldSize = 5439488 (5.1875MB)
NewRatio = 8
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
Heap Usage:
PS Young Generation 年輕代累加和是:100m
Eden Space:
capacity = 78643200 (75.0MB)
used = 1572880 (1.5000152587890625MB)
free = 77070320 (73.49998474121094MB)
2.0000203450520835% used
From Space:
capacity = 13107200 (12.5MB)
used = 0 (0.0MB)
free = 13107200 (12.5MB)
0.0% used
To Space:
capacity = 13107200 (12.5MB)
used = 0 (0.0MB)
free = 13107200 (12.5MB)
0.0% used
PS Old Generation
capacity = 838860800 (800.0MB)
used = 0 (0.0MB)
free = 838860800 (800.0MB)
0.0% used
PS Perm Generation
capacity = 21757952 (20.75MB)
used = 2606792 (2.4860305786132812MB)
free = 19151160 (18.26396942138672MB)
11.980870258377259% used
實驗4:-XX:NewRatio被-Xmn覆蓋
[@zw_83_83 test]# java -Xms900m -Xmx900m -Xmn400m -XX:NewRatio=8 JVMNewSize
running ...
經過Xmn設置400m,可是NewRatio=8,表示100m,最終是400m仍是100呢??
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 943718400 (900.0MB)
NewSize = 419430400 (400.0MB)
MaxNewSize = 419430400 (400.0MB)
OldSize = 5439488 (5.1875MB)
NewRatio = 8 數值上都是按設置的數值,變化了!!!
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
Heap Usage:
PS Young Generation 新生代的累加和是400m
Eden Space:
capacity = 314572800 (300.0MB)
used = 6291472 (6.0000152587890625MB)
free = 308281328 (293.99998474121094MB)
2.000005086263021% used
From Space:
capacity = 52428800 (50.0MB)
used = 0 (0.0MB)
free = 52428800 (50.0MB)
0.0% used
To Space:
capacity = 52428800 (50.0MB)
used = 0 (0.0MB)
free = 52428800 (50.0MB)
0.0% used
PS Old Generation
capacity = 524288000 (500.0MB)
used = 0 (0.0MB)
free = 524288000 (500.0MB)
0.0% used
PS Perm Generation
capacity = 21757952 (20.75MB)
used = 2606792 (2.4860305786132812MB)
free = 19151160 (18.26396942138672MB)
11.980870258377259% used