JVM参数配置及调优说明

1、基本JVM配置

说明,下面Jdk1.7和Jdk1.8的配置划分其实没那么多明确,主要是“永久代”和“元空间”配置区别就行。其他一样!!!

JDK1.7及以前版本配置
整个堆大小=年轻代+年老代+持久代
持久代不配置的话,一般固定是64m,如果增大年轻代,那么持久代会减少。一般年轻代配置为堆大小的3/8.

JAVA_OPTS="-server -Xmn1024m -Xms3550m -Xmx3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:PermSize=16m -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0"

-server:服务器模式
-Xmn1024m:设置年轻代大小是1G。一般为整个堆大小的3/8.
-Xms3550m:JVM堆最小内存大小。
-Xmx3550m:JVM堆最大内存大小。一般-Xmx和-Xms一样,避免每次GC后,JVM重新调整分配内存。
-Xss128k: 每个线程stack的大小。
-XX:SurvivorRatio=4:年轻代Eden区和Sur区比例。4表示4:1:1
-XX:NewRatio=4:年轻代和年老代比值。
-XX:PermSize=16m:永久代最小内存大小。
-XX:MaxPermSize=16m:永久代最大内存大小。
-XX:MaxTenuringThreshold=0:这是年轻代进入年老代的年龄设置。

JDK1.8版本配置
整个堆大小=年轻代+年老代,没有永久代,被元数据区代替,且不属于堆内存。【其实主要是PermSize和MaxPermSize配置失效】

JAVA_OPTS="-server -Xmn1024m -Xms3550m -Xmx3550m -Xss128k -XX:+DisableExplicitGC  -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Duser.timezone=GMT+8 -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy"

-XX:+DisableExplicitGC //忽略手动调用GC, System.gc()的调用就会变成一个空调用,完全不触发GC
-XX:+UseConcMarkSweepGC //并发标记清除(CMS)收集器
-XX:+CMSParallelRemarkEnabled //降低标记停顿
-XX:LargePageSizeInBytes=128m //内存页的大小
-XX:+UseFastAccessorMethods //原始类型的快速优化
-XX:+UseCMSInitiatingOccupancyOnly //使用手动定义初始化定义开始CMS收集
-XX:CMSInitiatingOccupancyFraction=70 //使用cms作为垃圾回收使用70%后开始CMS收集
-Duser.timezone=GMT+8 //设定GMT区域,避免CentOS坑爹的时区设置
-XX:MetaspaceSize=N :这个参数是初始化的Metaspace大小,该值越大触发Metaspace GC的时机就越晚。随着GC的到来,虚拟机会根据实际情况调控Metaspace的大小,可能增加上线也可能降低。在默认情况下,这个值大小根据不同的平台在12M到20M浮动。使用java -XX:+PrintFlagsInitial命令查看本机的初始化参数,-XX:Metaspacesize为21810376B(大约20.8M)。
-XX:MaxMetaspaceSize=N :这个参数用于限制Metaspace增长的上限,防止因为某些情况导致Metaspace无限的使用本地内存,影响到其他程序。默认无上限。
-XX:MinMetaspaceFreeRatio=N :当进行过Metaspace GC之后,会计算当前Metaspace的空闲空间比,如果空闲比小于这个参数,那么虚拟机将增长Metaspace的大小。在本机该参数的默认值为40,也就是40%。设置该参数可以控制Metaspace的增长的速度,太小的值会导致Metaspace增长的缓慢,Metaspace的使用逐渐趋于饱和,可能会影响之后类的加载。而太大的值会导致Metaspace增长的过快,浪费内存。
-XX:MaxMetasaceFreeRatio=N :当进行过Metaspace GC之后, 会计算当前Metaspace的空闲空间比,如果空闲比大于这个参数,那么虚拟机会释放Metaspace的部分空间。在本机该参数的默认值为70,也就是70%。
-XX:MaxMetaspaceExpansion=N :Metaspace增长时的最大幅度。在本机上该参数的默认值为5452592B(大约为5MB)。
-XX:MinMetaspaceExpansion=N :Metaspace增长时的最小幅度。在本机上该参数的默认值为340784B(大约330KB为)。

2、并行收集器的配置

(1)、吞吐量优先并行收集器

JAVA_OPTS="-server -Xmn1024m -Xms3550m -Xmx3550m -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy"

-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。
-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。
-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。

(2)、响应时间优先并行收集器

并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。适用于应用服务器、电信领域等。

JAVA_OPTS="-server -Xmn1024m -Xms3550m -Xmx3550m -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC 
-XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection"

-XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。
-XX:+UseParNewGC:设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。
-XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。
-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片

3、常见配置参数介绍

堆参数设置
-XX:+PrintGC 使用这个参数,虚拟机启动后,只要遇到GC就会打印日志
-XX:+PrintGCDetails 可以查看详细信息,包括各个区的情况
-XX:+PrintHeapAtGC 打印 GC 前后的详细堆栈信息
-XX:+PrintFlagsInitial 打印JVM初始化参数。
-XX:+PrintFlagsFinal 标记人为修改过的参数。
-XX:+PrintCommandLineFlags 查看默认垃圾回收器。
-XX:+PrintGCTimeStamps
-Xloggc:filename
-Xms3550m(默认物理内存的64分之一) 设置Java程序启动时初始化JVM堆内存大小
-Xmx3550m(默认物理内存的4分之一) 设置Java程序能获得最大JVM堆内存大小
在实际工作中,我们可以直接将初始的堆大小与最大堆大小设置相等,这样的好处是可以减少程序运行时的垃圾回收次数,从而提高性能。

新生代参数设置
-XX:NewSize=5m 设置新生代最小空间大小
-XX:MaxNewSize=10m 设置新生代最大空间大小
-Xmn2g 可以设置新生代的大小,设置一个比较大的新生代会减少老年代的大小,这个参数对系统性能以及GC行为有很大的影响,新生代大小一般会设置整个堆空间的1/3。
-XX:SurvivorRatio=8(默认) 用来设置新生代中eden空间和from/to空间的比例。含义:-XX:SurvivorRatio=eden/from=eden/to。 基本策略:尽可能将对象预留在新生代,减少老年代的GC次数。
-XX:NewRatio=2(默认) 设置新生代和老年代的比例:-XX:NewRatio=老年代/新生代。

对象进入老年代的参数设置
-XX:MaxTenuringThreshold=15 新生代每次GC之后如果对象没有被回收,则年龄加1,默认情况下为15

堆溢出参数设置
-XX:+HeapDumpOnOutOfMemoryError 使用该参数可以在内存溢出时导出整个堆信息
-XX:HeapDumpPath=D:/OOM.dump 可以设置导出堆的存放路径。

垃圾回收器设置
串行垃圾回收器(单个垃圾回收线程,所有其他工作线程暂停:STW):
-XX:+UseSerialGC(年轻代复制算法,年老代标记-整理算法)
配置串行回收器,开启后新,老都是串行垃圾回收。
--------串行收集器特别适合堆内存不高、单核甚至双核CPU的场合。

并行垃圾回收器(多个垃圾回收线程,所有其他工作线程暂停:STW):
-XX:+UseParallelGC(复制算法)(与下面配置选择其中一个即可,可以互相激活)
-XX:+UseParallelOldGC(标记-整理算法)
配置年轻代,年老代垃圾收集方式为并行收集。 JDK6.0 支持对年老代并行收集。
-XX:ParallelGCThreads=4
配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
-XX:+UseAdaptiveSizePolicy
设置此选项后,并行收集器会自动选择年轻代区大小和相应的 Survivor 区比例,
以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。
-XX:MaxGCPauseMillis=100
设置每次并发收集最大停顿时间。设定此值可能会减少应用的吞吐量。
ParallelGC 工作时,会调整 Java 堆大小或者其他的一些参数,尽可能的把停顿时间控制在 MaxGCPauseMillis 以内。
-------并行收集器适合对吞吐量要求远远高于延迟要求的场合。
(吞吐量:应用程序线程用时占程序总用时的比例,暂停时间:一个时间段内应用程序线程让与GC线程执行而完全暂停)

并发垃圾回收器(并发-标记-清除算法)(多个垃圾回收线程,用户线程不暂停:CMS)(只针对年老代):
-XX:+UseParNewGC(复制算法)(自动激活UseConcMarkSweepGC年老代并发垃圾回收器)(STW)
选择新生代垃圾收集器为并行收集器。
-XX:+UseConcMarkSweepGC(标记-清除算法)(自动激活UseParNewGC年轻代并发垃圾回收器)(CMS)
设置年老代为并发收集。
此回收器出错后,备用是Serial Old串行回收器,如果在回收完成之前堆内存耗尽,CMS回收失败。
-XX:+UseCMSCompactAtFullCollection
打开对年老代的压缩。可能会影响性能,但是可以消除碎片。参数指定每次 CMS 后进行一次碎片整理。
-XX:CMSFullGCsBeforeCompaction=5
由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。
此值设置运行多少次 GC 以后对内存空间进行压缩、整理。
-XX:ParallelGCThreads=4
指定 GC 工作线程数量。
-XX:ParallelCMSThreads=4
设定 CMS 并发线程数。
-XX:-CMSParallelRemarkEnabled : 手动配置开启并行标记,节省年轻代标记时间,JDK1.6以前不需要配置,默认开启
------CMS并发收集、低停顿。非常适合堆内存大、CPU核数多的服务器端应用。
注重服务的响应速度,希望系统停顿时间最短,给用户带来更好的体验等场景下。如web程序、b/s服务。

G1垃圾回收器(年轻代垃圾回收会暂停所有其他线程:STW):
年轻代的垃圾收集, 会发生stop the world。 在回收时所有的应用程序线程都会被暂停。通过多线程并行进行。收集器可以工作在young 区,也可以工作在 old 区。
-XX:UseG1GC(并行+并发)(不会产生碎片)
存储不需要物理上连续,只需要逻辑上连续。
-XX:G1HeapRegionSize=n
指定分区大小(1mb-32mb,必须是2的幂),默认2048个分区。
-XX:MaxGCPauseMillis=100(单位毫秒)
设置每次并发收集最大停顿时间。设定此值可能会减少应用的吞吐量。
如果任何一次停顿超过这个设置值时,G1 就会尝试调整新生代和老年代的比例,调整堆大小,调整晋升年龄的手段,试图达到目标。
-XX:GCPauseIntervalMillis=n
设置停顿时间间隔。
-XX:ParallelGCThreads=4
由于是并行并发的,可以指定 GC 工作线程数量。
------G1的收集,年轻代和老年代的收集界限比较模糊,采用了混合(mixed)收集的方式。即每次收集既可能只收集年轻代分区(年轻代收集),也可能在收集年轻代的同时,包含部分老年代分区(混合收集)
G1的应用场合往往堆内存都比较大,所以Full GC(可用内存不足时触发)的收集代价非常昂贵,应该避免Full GC的发生。
G1能够独自管理整个Java堆,并行与并发,不会产生空间碎片,低停顿,可预测的停顿。

收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器

并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

栈参数设置
-Xss1m(默认) 来指定线程的最大栈空间

方法区参数设置
JDK1.2 ~ JDK6,使用永久代来实现方法区
-XX:PermSize=64M 设置永久代最小空间大小。
-XX:MaxPermSize=64M(默认) 如果系统运行时生产大量的类,就需要设置一个相对合适的方法区,以免出现永久区内存溢出的问题。

Java8,元空间取代永久代
存储位置不同,永久代物理是是堆的一部分,和新生代,老年代地址是连续的,而元数据放到本地化的堆内存(native heap)中,这一块区域就叫Metaspace,中文名叫元空间。
存储内容不同,元空间存储类的元信息,静态变量和常量池等并入堆中。 相当于永久代的数据被分到了堆和元空间中。
-XX:MetaspaceSize=128m(默认) 初始化大小。
-XX:MaxMetaspaceSize=128m JVM默认在运行时根据需要动态地设置MaxMetaspaceSize的大小。

直接内存(堆外内存)参数设置

-XX:MaxDirectMemorySize=64m
该值是有上限的,默认是64M,最大为sun.misc.VM.maxDirectMemory()。
直接内存使用达到上限时,就会触发垃圾回收(Full GC),如果不能有效的释放空间,就会引起系统的OOM。
注:heap ByteBuffer,该类对象分配在JVM的堆内存里面,直接由Java虚拟机负责垃圾回收。
direct ByteBuffer是通过jni在虚拟机外内存中分配的。

堆外内存:
生命周期中等或较长的对象,适合堆外内存。
直接的文件拷贝操作,或者I/O操作,适合堆外内存:
直接使用堆外内存就能少去资源从用户内存拷贝到系统内存的操作。

TLAB参数设置
Thread Local Allocation Buffer即线程本地分配缓存:
一个线程专用的内存分配区域,是为了加速对象分配对象而生的。
每一个线程都会产生一个TLAB,该线程独享的工作区域,Java虚拟机使用这种TLAB区来避免多线程冲突问题,提高了对象分配的效率。
-XX:+UseTLAB(默认开启) 使用TLAB
-XX:TLABSize=64k(默认) 设置TLAB初始化大小
-XX:TLABRefillWasteFraction=64 设置维护进入TLAB空间的单个对象大小,它是一个比例值,默认为64,即如果对象大于整个空间的1/64,则在堆创建对象。
-XX:+ResizeTLAB 自调整TLABRefillWasteFraction阈值。
-XX:+PrintTLAB 查看TLAB信息

4、调优说明

年轻代大小选择
响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。
吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。
年老代大小选择
响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得:
A:并发垃圾收集信息
B:持久代并发收集次数
C:传统GC信息
D:花在年轻代和年老代回收上的时间比例
减少年轻代和年老代花费的时间,一般会提高应用的效率
吞吐量优先的应用

一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。
较小堆引起的碎片问题
因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。如果出现“碎片”,可能需要进行如下配置:
A: -XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。
B: -XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamBoy_W.W.Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值