30、JVM实战:参数

24.1–参数


1、常用参数

1.1、-Xms

1、 初始堆大小;
2、 默认值:物理内存的1/64(<1GB);
3、 默认空余堆内存小于40%时,JVM就会增大堆,直到-Xmx的最大限制;

1、 可以通过MinHeapFreeRatio参数可以调整;

1.2、-Xms

1、 最大堆大小;
2、 默认值:物理内存的1/4(<1GB);
3、 默认空余堆内存大于70%时,JVM会减少堆,直到-Xms的最小限制;

1、 可以通过MaxHeapFreeRatio参数可以调整;

1.3、-Xmn

1、 年轻代大小(1.4orlator);
2、 此处的大小是eden+from+to;
3、 推荐配置:整个堆的3/8;
4、 注意;

1、 整个堆大小=年轻代大小+年老代大小;
2、 增大年轻代后,将会减小年老代大小,此值对系统性能影响较大;

1.4、-Xss

1、 设置单个线程栈大小;
2、 JDK1.5+中默认是1M;
3、 相同物理内存下,减小这个值能生成更多的线程,但是操作系统对一个进程内的线程数还是有限制的,不能无限生成;

1、 小的应用:建议128k;
2、 大的应用:建议256k;
4、 这个选项对性能影响比较大,需要严格的测试;

1.5、-XX:ThreadStackSize

1、 线程栈的大小;
2、 Xss=ThreadStackSize;

1.6、-XX:NewRatio

1、 年轻代(包括Eden和两个Survivor区)与年老代的比值;
2、 -XX:NewRatio=4表示年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5;
3、 Xms=Xmx并且设置了Xmn的情况下,该参数不需要进行设置;

1.7、-XX:SurvivorRatio

1、 Eden区与Survivor区的大小比值;
2、 默认:8,也就是Eden:from:to=8:1:1;

1.8、-XX:LargePageSizeInBytes

1、 内存页的大小;
2、 不可设置过大,会影响Perm的大小;
3、 默认:128m;

1.9、-XX:+UseFastAccessorMethods

1、 原始类型的快速优化;
2、 get,set方法转成本地代码(对于jvm来说是冗余代码,jvm将进行优化);

1.11、-XX:+DisableExplicitGC

禁止显式执行GC,不允许通过代码来触发GC。

1.11、-XX:MaxTenuringThreshold

1、 垃圾最大年龄;
2、 如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代,对于年老代比较多的应用,可以提高效率;
3、 如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率;
4、 该参数只有在串行GC时才有效;

1.12、-XX:+UseBiasedLocking

1、 禁用偏向锁;
2、 在存在大量锁对象的创建并高度并发的环境下禁用偏向锁能够带来一定的性能优化;

1.13、-Xnoclassgc

禁用垃圾回收

1.14、-XX:SoftRefLRUPolicyMSPerMB

1、 每兆堆空闲空间中SoftReference的存活时间;
2、 默认值:1s;

1.15、-XX:PretenureSizeThreshold

1、 对象超过多大时,直接在老年代分配;
2、 默认:0;
3、 单位字节;
4、 新生代采用ParallelScavengeGC时无效;

1.16、-XX:TLABWasteTargetPercent

1、 TLAB占eden区的百分比;
2、 默认:1%;

1.17、-XX:+CollectGen0First

1、 FullGC时是否先YGC;
2、 默认:false;

2、并行收集器 参数

2.1、-XX:+UseParallelGC

1、 使用Parallel收集器;
2、 可以同时并行多个垃圾收集线程,但此时用户线程必须停止;
3、 此配置仅对年轻代有效,即上述配置下;

1、 年轻代使用并发收集;
2、 年老代仍旧使用串行收集;
4、 不能和CMSgc一起使用;

2.2、-XX:+UseParNewGC

1、 设置年轻代为并行收集,是UseParallelGC的升级版本,有更好的性能或者优点;
2、 可与CMS收集同时使用;
3、 JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值;

2.3、-XX:ParallelGCThreads

1、 并行收集器的线程数;
2、 此值最好配置与处理器数目相等;
3、 适用于CMS;

2.4、-XX:+UseParallelOldGC

1、 老年代垃圾收集方式为并行收集(ParallelCompacting);

2.4、-XX:MaxGCPauseMillis

1、 控制最大垃圾收集停顿时间(毫秒),收集器尽可能的保证每次垃圾收集耗费的时间不超过这个设定值;

1、 如果这个这个值设定的过小,那么ParallelScavenge收集器为了保证每次垃圾收集的时间不超过这个限定值,会导致垃圾收集的次数增加和增加年轻代的空间大小,垃圾收集的吞吐量也会随之下降;
2、 XX:MaxGCPauseMillis设置的越小,吞吐量则必然越小;

2.5、-XX:+UseAdaptiveSizePolicy

1、 自动设置新生代的大小、Eden与Survivor区的比例,晋升老年代对象年龄等细节参数;
2、 设置此选项后,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量,这种调节方式称为GC自适应的调节策略(GCErgonomics);
3、 只需要把基本的内存数据设置好(如-Xmx设置最大堆),然后使用MaxGVPauseMillis参数或GCTimeRation参数给虚拟机设立一个优化目标,JVM会自动调节其他优化参数.;
4、 自适应调节策略也是ParallelScavenge收集器与ParNew收集器的一个重要区别;
5、 使用并行收集器时,建议一直打开;
6、 对于面向外部的大流量、低延迟系统,不建议启用此参数,建议关闭该参数;

2.6、-XX:GCTimeRatio

1、 设置垃圾收集时间占系统运行时间的百分比(>0,<100);

1、 如果把值设置为19,即系统运行时间:GC收集时间=19:1,那么GC收集时间就占用了总时间的5%【1/(19+1)=5%】;
2、 默认值为99,即最大允许1%的垃圾收集时间;

2.7、-XX:+ScavengeBeforeFullGC

1、 FullGC前调用年轻代GC;
2、 默认:true;

3、CMS 参数

3.1、-XX:+UseConcMarkSweepGC

1、 使用CMS内存收集;

3.2、-XX:+AggressiveHeap

1、 会检测主机的资源(内存大小、处理器数量),然后调整相关的参数,使得长时间运行的、内存申请密集的任务能够以最佳状态运行;
2、 该选项最初是为拥有大量内存和很多处理器的主机而设计的,但是从J2SE1.4.1以及其后继版本来看,即使是对于那些只有4颗CPU的主机,该选项都是很有帮助的,因此,吞吐收集器(-XX:+UseParallelGC)、大小自适应(-XX:+UseAdaptiveSizePolicy)以及本选项(-XX:+AggressiveHeap)经常结合在一起使用;
3、 要使用本选项,主机上至少要有256M的物理内存;

3.3、-XX:CMSFullGCsBeforeCompaction

1、 多少次GC后进行一次碎片整理;
2、 由于并发收集器不对内存空间进行压缩,整理,所以运行一段时间以后会产生"碎片",使得运行效率降低,此值设置运行多少次GC以后对内存空间进行压缩,整理;

3.4、-XX:+CMSParallelRemarkEnabled

降低标记停顿

3.5、-XX+UseCMSCompactAtFullCollection

1、 在FULLGC的时候,对年老代进行一次碎片整理;整理过程是独占的,会引起停顿时间变长;
2、 CMS是不会移动内存的,因此,这个非常容易产生碎片,导致内存不够用,因此,内存的压缩这个时候就会被启用;
3、 增加这个参数是个好习惯;
4、 可能会影响性能,但是可以消除碎片;

3.6、-XX:+UseCMSInitiatingOccupancyOnly

1、 使用手动定义初始化定义开始CMS收集;
2、 禁止hostspot自行触发CMSGC;

3.7、-XX:CMSInitiatingOccupancyFraction=70

1、 指定设定的回收阈值(这里是70);
2、 如果不指定,JVM仅在第一次使用设定值,后续则会根据运行时采集的数据做自动调整;
3、 如果指定了该参数,那么每次JVM都会在到达规定设定值时才进行GC;
4、 默认:92;
5、 不过大多数情况下,JVM都能够作出更好的垃圾收集决策,所以如果不是很有信心的话,不建议使用该参数,放心的把决定权交给JVM;

3.8、-XX:CMSInitiatingPermOccupancyFraction

1、 设置永久代使用到达多少比率时触发GC;
2、 默认:92;

3.9、-XX:+CMSIncrementalMode

1、 用增量式的标记方式,减少标记时应用停顿时间;
2、 用于单CPU情况;

3.10、-XX:ParallelCMSThreads

设定CMS的线程数量(一般情况约等于可用CPU数量) 。