jvm常见参数汇总
主要是针对之前的学习,进行一个参数的集中整理。
一、环境因素
JVM 中最大堆大小有三方面限制:
相关操作系统的数据模型(32-bt还是64-bit)限制;
系统的可用虚拟内存限制;
系统的可用物理内存限制。32位系统下,一般限制在
1.5G ~ 2G
;64为操作系统对内存无限制。
在内存自动管理过程中,新生代中的98%对象都是”朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块比较大的Eden
空间和两块较小的Survivor
空间,每次使用Eden
和其中一块Survivor
。当回收时,将Eden
和Survivor
中还存活着的对象一次性地复制到另外一块Survivor
空间上,最后清理掉Eden
和刚才用过的Survivor
空间。HotSpot
虚拟机默认Eden
和Survivor
的大小比例是8:1
,也就是说,每次新生代中可用内存空间为整个新生代容量的90%(80%+10%),只有10%的空间会被浪费。
二、参数使用说明
参数使用是以 -XX:
为前缀,中间以 +
或 -
连接,后面跟参数名,如果需要设置参数值的使用赋值符号 =
连接值。
+
:表示启用该参数; -
:表示禁用该参数。
如:
-XX:SurvivorRatio=8
三、通用的参数
通用的参数是不需要区分收集器的。
基本常用参数
参数关键词 | 参数说明 | 示例 |
---|---|---|
-Xms | 设置堆的最小值,初始内存大小。 | -Xms1024m 堆的初始内存为1G。 |
-Xmx | 设置堆的最大值 ,最大可用内存。 | -Xms1024m 堆的最大可用内存为1G。一般为系统可用内存的1/4大小 |
-Xmn | 设置新生代(年轻代)的大小。 | -Xmn380m 不设置则默认值为堆内存的1/3 。 |
-Xss | 设置每个线程的堆栈大小。 在相同物理内存下,减小这个值能生成更多的线程。 | -Xss128k 一般默认Linux x64为1024K。 |
-XX:NewSize | 新生代初始化内存大小,该值需要小于-Xms的值 | -XX:NewSize=512m |
-XX:MaxNewSize | 新生代可分配内存大小,该值需要小于-Xmx的值 | -XX:MaxNewSiz=900m |
-XX:SurvivorRatio | 年轻代中 Eden:SFrom:STO=n:1:1 | -XX:SurvivorRatio=8 |
-XX:PretenureSizeThreshold | 设置直接晋升到老年代的对象大小 | -XX:PretenureSizeThreshold=4m 对象如果超过4M就可以直接晋升到老年代 |
-XX:MaxTenuringThreshold=0 | 垃圾最大年龄,置垃圾最大年龄。大于这个年龄的都会进入老年代区。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。 | -XX:MaxTenuringThreshold=0 -XX:MaxTenuringThreshold=15 |
特别说明:
-Xms
:物理内存的1/64(<1GB)。默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制。
-Xmx
:物理内存的1/4(<1GB)默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。
-Xmn
:整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。 增大年轻代后,将会减小年老代大,此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-XX:PermSize
:物理内存的1/64。
-XX:MaxPermSize
:物理内存的1/4。
-Xss
: JDK5以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行 调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右
一般小的应用,如果栈不是很深,应该是128k够用的,大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。
-XX:SurvivorRatio
: Eden区与Survivor区的大小比值。设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
-XX:MaxTenuringThreshold
:如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率,该参数只有在串行GC时才有效。
直接内存设置
直接内存,就是堆外内存
-XX:MaxDirectMemorySize=1024m
当缓冲区分配的堆外内存到达指定大小后,即触发Full GC
。注意该值是有上限的,默认是64M,最大为sun.misc.VM.maxDirectMemory()
,在程序中中可以获得-XX:MaxDirectMemorySize
的设置的值。
方法区/永久代/非堆区
jdk1.7及之前:
-XX:PermSize
-XX:MaxPermSize;
jdk1.8以后:
-XX:MetaspaceSize
-XX:MaxMetaspaceSize
MetaspaceSize
默认20.8M左右(x86下开启c2模式),主要是设置metaspaceGC发生的初始阈值,也是最小阈值,MaxMetaspaceSize
默认基本是无穷大,建议设置,设置后参数会限制metaspace(包括了Klass Metaspace以及NoKlass Metaspace)被committed的内存大小,会保证committed的内存不会超过这个值,一旦超过就会触发GC。
四、垃圾回收统计信息
统计信息参数
参数关键词 | 参数说明 |
---|---|
-XX:+PrintGC | 显示GC |
-XX:+PrintGCDetails | 显示GC详细信息 |
-XX:+PrintGCTimeStamps | 显示GC 收回时间戳 |
-XX:+PrintGCDateStamps | 打印GC 操作的时间戳 |
-Xloggc:filename | 把相关日志信息记录到文件以便分析 |
-XX:PrintHeapAtGC | 打印GC前后的详细堆栈信息 |
五、收集器参数
Serial 串行收集器
Serial / Serial old
无需多线程交互,但无法发挥出多处理器的优势,适合单处理器的机器以及数据量较小的情况。
-XX:+UseSerialGC
虚拟机运行在Client 模式下的默认值,打开此开关后,使用 (新生代)Serial + (老年代)Serial Old
的收集器组合进行内存回收。
ParNew 并行收集器
-XX:+UseParNewGC
启用该参数后,使用ParNew + Serial Old 的收集器组合进行内存回收。
Parallel 并行收集器
Parallel / Parallel old
1、年轻代开启并行
jdk5引入,用于对年轻代进行回收,一般用在多线程处理器上。使用以下设置可以开启使用。
-XX:+UseParallerGC
虚拟机server模式,使用Parallel Scavenge+Serial Old
的收集器组合进行内存回收。
2、老年代开启并行
jdk6之后可对老年代进行回收,若不打开默认是单线程,使用-XX:+UseParallerOldGC
开启使用。
-XX:+UseParallerOldGC
打开此开关后,使用Parallel Scavenge + Parallel Old
的收集器组合进行内存回收
Parallel Scavenge 收集器
1、 目标最大停顿
控制最大垃圾收集停顿时间,一般200 ~ 300
毫秒。
-XX:MaxGCPauseMillis=200
2、目标吞吐量参数
直接设置吞吐量大小的
-XX:GCTimeRatio=99
值则应当是一个大于0小于100的整数,也就是垃圾收集时间占总时间的比率,相当于吞吐量的倒数。如把此参数设置为19,那允许的最大垃圾收集时间就占总时间的5%(即1/(1+19)),默认值为99,即允许最大1%(即1/(1+99))的垃圾收集时间。
3、自适应策略参数
自适应调节策略参数:
-XX:+UseAdaptiveSizePolicy
参数被激活之后,就不需要人工指定新生代的大小(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRatio)、晋升老年代对象大小(-XX:PretenureSizeThreshold)等细节参数。虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量。这种调节方式称为垃圾收集的自适应的调节策略(GC Ergonomics)。
CMS 收集器
1、启用CMS收集器
-XX:+UseConcMarkSweepGC
打开此开关后,使用ParNew + CMS + Serial Old
的收集器组合进行内存回收。ParNew
收集器是激活CMS后(使用-XX:+UseConcMarkSweepGC选项)的默认新生代收集器。Serial Old
收集器将作为 CMS 收集器出现Concurrent Mode Failure
失败后的后备收集器使用。
2、老年代阈值触发CMS
老年代使用多少后触发 CMS:
-XX:+CMSInitiatingOccupancyFraction=68%
在JDK 5的默认设置下,CMS收集器当老年代使用了68%的空间后就会被激活,在实际应用中老年代增长并不是太快,可以适当调高参数-XX:CMSInitiatingOccu-pancyFraction
的值来提高CMS的触发百分比,降低内存回收频率,获取更好的性能。
3、碎片整理条件参数
CMS 在n次GC后,启动内存碎片整理。
-XX:+CMSFullGCsBeforeCompaction=5
是用于设置执行多少次不压缩的Full GC后,跟着来一次带压缩的(默认值为0,表示每次进入FullGC时都进行碎片整理)。
CMS 完成后,启动内存碎片整理:
-XX:+UseCMSCompactAtFullCollection
4、增量模式参数
增量模式,适用于单CPU情况:
-XX:+CMSIncrementalMode
5、CMS 年轻代收集并行线程数参数
CMS 年轻代收集方式为并行收集时,使用的CPU数,并行收集线程数。
-XX:ParallelGCThreads=n
G1 收集器
1、G1 启用参数
-XX:+UseG1GC
2、目标最大停顿时间
指定目标的最大停顿时间,默认值是200毫秒。G1尝试调整新生代和老年代的比例,堆大小,晋升年龄来达到这个目标时间。
-XX:MaxGCPauseMillis=200
3、GC工作线程数
设置GC的工作线程数量参数
-XX:ParallerGCThreads=n
其他参数
1、年轻代Eden区占比
年轻代中 Eden:SFrom:STO=n:1:1
,第一个表格已说明。
-XX:SurvivorRatio=n
2、直接晋升老年代大小
设置直接晋升到老年代的对象大小,第一个表格已说明。
-XX:PretenureSizeThreshold
3、担保策略参数
老年代的剩余空间不足以应付新生代的整个Eden和Survivor区的所有对象都存活的极端情况时,是否允许分配担保失败:
-XX:HandlePromotionFailure
4、加速编译
加快编译参数,通常在项目稳定之后,改动较小时使用,该参数会在编译时忽略一些Class内部检查。
-XX:+AggressiveOpts
5、线程栈大小参数
-XX:ThreadStackSize=0
0表示使用默认堆栈大小。[Sparc:512;Solaris x86:320(5.0及更早版本中为256);Sparc 64位:1024;Linux amd64:1024(在5.0及更早版本中为0);所有其他0。]
六、JDK 默认GC收集器
jdk1.7 和 jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)。
jdk1.9 默认垃圾收集器G1。
如果想知道自己的运行环境的JVM使用了何种收集器,怎么办?
(1)使用-XX:+PrintCommandLineFlagsjvm
参数可查看默认设置收集器类型。
java -XX:+PrintCommandLineFlags -version
(2)使用-XX:+PrintGCDetails
参数打印的GC日志的新生代、老年代名称判断收集器类型。
七、参数补充
如果整理遗漏,后续补充。
本次整理日期:2020年7月16日。
参考:
https://blog.csdn.net/wangsweetkid/article/details/94310547
https://www.jianshu.com/p/950e6990bd80
https://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html