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覆盖
1、 只覆盖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
2、 只覆盖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
3、 两个都覆盖
[@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
分享到:
相关推荐
【IT十八掌徐培成】Java基础第26天-02.jvm-young gen-old gen-eden-sur-jvisualvm-jconsole.zip
希望我得文档能帮助您解决问题,来吧,赶紧来看看这篇文档
JVM参数设置,提供java虚拟机运行时的参数设置
JAVA命令大全-JVM设置.rar JAVA命令大全-JVM设置.rar
eclipse与tomcat的JVM设置
现在Java独立进程应用尚未有一套中间件软件来管理 , 故其使用的JVM大小... 由此就会造成JVM设置不合理 – 往往是超出了实际物理内存的大小 , 导致运行不稳定 . 因此写此文档 , 用以指导开发人员如何正确设置JVM的大小 .
设置虚拟机大小,本文档很专业的指导大家如何设置JVM虚拟机内存大小
你对Eclipse中JVM内存设置方法是否熟悉,这里通过几个问题向大家解释一下,安装Java开发软件时,默认安装包含两个文件夹,一个JDK(Java开发工具箱),一个JRE(Java运行环境,内含JVM),其中JDK内另含一个JRE。
Tomcat JVM虚拟机默认内存1800 M左右,当服务内存不够用时,需要手动设置内存大小,不可超过服务器系统内存的80%,本文档提供设置方法(使用命令启动有效),实测可用。
设置Tomcat的JVM虚拟机内存大小,防止内存溢出
java获得jvm内存大小
设置Eclipse的JVM参数
linux 下jvm基本参数设置 查看linux jvm的设置基本命令
JVM内存设置与调优指南
如何配置Tomcat的JVM虚拟机内存大小
在/usr/local/apache-tomcat-5.5.23/bin目录下的catalina.sh 添加:JAVA_OPTS='-Xms512m -Xmx1024m' 要加“m”说明是MB,否则就是KB了,在启动tomcat时会报内存不足。 -Xms:初始值 ...重起tomcat服务,设置生效
Jvm常用内存设置,感觉比较有用,收藏下来。