JVM設置Young Gen大小

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 
相關文章
相關標籤/搜索