X
或者 XX
开头的都是非标准化参数:意思就是说标准化参数不会变,非标准化参数可能在每个JDK版本中有所变
化,但是就目前来看 X
开头的非标准化的参数改变的也是非常少。
格式:-XX:[+-]<name>
表示启用或者禁用 name 属性。
例子:-XX:+UseG1GC
表示启用 G1 垃圾收集器。
# 示例
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:PermSize=16m -XX:MaxPermSize=16m -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=0 -jar App.jar
-Xmx3550m
:设置最大堆大小为3550m
。
-Xms3550m
:设置初始堆大小为3550m
。
-Xss128k
:设置每个线程的堆栈大小为128k
。
-Xmn2g
:设置年轻代大小为2g
。
-XX:PermSize
:设置初始永久代大小为16m
。
-XX:MaxPermSize
:设置最大持久代大小为16m
。JDK 1.8 以后取消了该参数,改为了元数据空间:
-XX:MaxMetaspaceSize
。
-XX:MetaspaceSize
: 设置元空间大小。
-XX:NewSize=n
:设置年轻代大小。
-XX:NewRatio=4
:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。
-XX:NewRatio=4
表示年轻代与年老代比值为1:4
,那么年轻代将占据堆内存的1/5
,老年代将占据堆内存
的4/5
,默认新生代和老年代的比例为1:2
。
-XX:SurvivorRatio=4
:设置年轻代中Eden区与Survivor区的大小比值,设置为 4,那么 Survivor 区的大小
将是 Eden 区大小的1/4
,则两个Survivor区与一个Eden区的比值为2:4
,一个Survivor区占整个年轻代的
1/6
。
-XX:MaxTenuringThreshold=0
:设置垃圾最大年龄,如果设置为0的话,则年轻代对象不经过Survivor区,
直接进入年老代。默认15岁,用来指定对象具体多少岁可以进入老年代。
-XX:PretenureSizeThreshold
: 设置垃圾最大字节数,将值设置为字节数,比如1048576字节,就是
1MB。意思就是如果你要创建一个大于这个大小的对象,那就直接把这个大对象放到老年代里去。
-XX:-HandlePromotionfailure
:设置之后会先判断老年代的平均空间是否能够放下 MinorGC 之后的对象
大小,否则直接Full GC ,JDK1.6 之后废弃掉了,默认判断老年代空间大于新生代所有对象之和,或者大于
Minor GC升入老年代的对象的平均大小。
在生产环境中,JVM的Xms
和Xmx
要设置成一样的,限定堆内存的总大小,能够避免GC
在调整堆大小带来的不必
要的压力。
-XX:+UseParNewGC
:加入这个选项,JVM启动之后对新生代进行垃圾回收,就是ParNew垃圾回收器了。默
认给自己设置的垃圾回收线程的数量就是跟CPU的核数是一样的。
-XX:+UseParallelGC
:选择垃圾收集器为并行收集器。
-XX:ParallelGCThreads
: 配置并行收集器的线程数,并行收集线程数,建议一般不要随意动这个参数。
-XX:MaxGCPauseMillis
:设置并行收集最大暂停时间。
-XX:GCTimeRatio
:设置垃圾回收时间占程序运行时间的百分比,公式为1/(1+n)。
-XX:+CMSIncrementalMode
:设置为增量模式,适用于单CPU情况。
-XX:+UseParalledlOldGC
:设置并行年老代收集器。
-XX:+UseConcMarkSweepGC
:设置并发收集器。
-XX:CMSFullGCsBeforeCompaction
:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以
后会产生"碎片",使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。
-XX:CMSInitiatingOccupancyFraction
:设置老年代占用多少比例的时候触发CMS垃圾回收,JDK1.6里面
的默认值是92%。
-XX:+UseCMSInitiatingOccupancyOnly
: 与上边参数配合,只用上边设定的值,否则会动态调整。
-XX:+UseCMSCompactAtFullCollection
: CMS的参数默认就打开的,意思是在Full GC之后再次进行"Stop
the World",停止工作线程,然后进行碎片整理,就是把存活对象都挪到一起,空出来大片连续内存空间,避
免内存碎片。打开对年老代的压缩,可能会影响性能,但是可以消除碎片。
-XX:CMSFullGCsBeforeCompation
: 设置经过多少次Full GC之后进行一次内存碎片整理。
-XX:+UseG1GC
: 指定使用G1垃圾回收器,此时会自动使用堆大小除以2048确定Region的大小。
-XX:G1HeapRegionSize
: 手动指定Region的大小。
-XX:G1NewSizePercent
: 设置新生代初始占比,其实维持这个默认值即可,默认值5% 。新生代最多不会
超过60%,也可以通过下边参数设置-XX:G1MaxNewSizePercent
。
-XX:MaxGCPauseMills
:设定GC停顿时间,默认值是200ms 也就是G1执行GC的时候可以让系统停顿多长
时间。
-XX:InitiatingHeapOccupancyPercent
: 默认值45% G1参数,如果老年代占据了堆内存45%的时候,就
会触发新生代+老年代一起回收的混合回收阶段。
-XX:G1MixedGCCountTarget
: G1参数,在一次混合回收过程中,最后一个阶段执行几次混合回收,默认值
是8次。
-XX:G1HeapWastePercent
: 默认值5% 在混合回收的时候,对Region的回收都是基于复制算法,将Region
中的存活对象复制到其它Region,然后把这个Region的垃圾全部清理掉,一旦空出来的Region达到堆内存的
5%,就立即停止混合回收。
-XX:G1MixedGCLiveThresholdPercent
:默认值85%,意思是确定要回收的Region的时候,必须是存活对
象低于85%的对象才可以回收。
-XX:+PrintGC
:开启垃圾收集(GC)的打印输出,JVM 会在控制台输出垃圾收集的相关信息,包括 GC 的时
间、频率、消耗的内存等。
-XX:+PrintGCDetails
:打印详细的GC日志。
-XX:+PrintGCTimeStamps
:打印出来每次GC的时间。
-Xloggc:filename
:GC日志输出到文件里filename,比如:-Xloggc:/gc.log
。
-XX:+PrintCommandLineFlags
:查看当前JVM设置过的相关参数。Dump 异常快照:
-XX:+HeapDumpOnOutOfMemoryError
:用于在发生 OutOfMemoryError 时自动生成堆转储(Heap Dump)文
件。
-XX:HeapDumpPath
:用于指定堆转储文件的存储位置。
堆内存出现 OOM 的概率是所有内存耗尽异常中最高的,出错时的堆内信息对解决问题非常有帮助,所以给JVM设
置这个参数(-XX:+HeapDumpOnOutOfMemoryError
),让JVM遇到OOM异常时能输出堆内信息,并通过
(-XX:+HeapDumpPath
)参数设置堆内存溢出快照输出的文件地址,这对于特别是对相隔数月才出现的OOM异常尤
为重要。
# 示例
-Xms10M -Xmx10M -Xmn2M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\study\log_hprof\gc.hprof
-XX:OnOutOfMemoryError
:表示发生OOM后,用于指定当发生 OutOfMemoryError 时要执行的命令。利
用这个参数,我们可以在系统OOM后,自定义一个脚本,可以用来发送邮件告警信息,可以用来重启系统等
等。
# 示例
-XX:OnOutOfMemoryError="C:\Program Files\Java\jdk1.8.0_151\bin\jconsole.exe"
表示发生OOM后,运行jconsole.exe程序,这里可以不用加"",因为jconsole.exe路径Program Files含有空格。
-XX:+CMSParallelInitialMarkEnabled
:在cms垃圾回收器的初始标记阶段开启多线程并发执行,可以减
少"stop the world"的时间。
-XX:+CMSScavengeBeforeRemark
: 在cms重新标记之前,先尽量执行一次YouongGC,先回收掉一些对
象,在重新标记阶段就能少扫描一些对象,提升重新标记阶段的性能。
-XX:TraceClassLoading
-XX:TraceClassUnloading
追踪类加载和类卸载的情况,他会通过日志打印出来
jvm中加载了哪些类,卸载了哪些类。
-XX:SoftRefLRUPolicyMSPerMB=0
: 这个参数设置大一些即可,千万别让一些新手同学设置为0,可以设置
个1000,2000,3000,或者5000毫秒,都可以。影响jvm自动创建的一些软引用对象的回收问题。
-XX:+DisableExplicitGC
: 禁止显示执行GC,不允许你通过代码来执行GC 。即调用System.gc(),平时开
发的时候也不要随便使用System.gc()去随便触发GC 。否则有可能压力过大的情况下导致每秒钟都会触发Full
GC,而此时各个区域的内存占用情况都比较正常。