JVM GC Parameter
Serial
-XX:+UseSerialGC
启用Serial收集器,其中新生代为Serial,老年代为Serial Old
-XX:+UseConcMarkSweepGC -XX:-UseParNewGC
老年代使用CMS收集器,JDK9中已不支持此收集器组合
ParNew
-XX:+UseParNewGC
启用ParNew收集器,其中新生代为ParNew,老年代为Serial Old(JDK9中已经不再支持ParNew/SerialOld组合使用,ParNew只能和CMS组合使用,此选项会报错)
-XX:+UseConcMarkSweepGC
老年代使用CMS收集器
-XX:ParallelGCThreads=<value>
并行GC线程数,默认值为CPU核心数
-XX:+UseParallelGC
新生代使用PS收集器,老年代默认使用ParallelOld收集器
Parallel Scavenge
-XX:+UseParallelGC
新生代使用PS收集器,老年代默认使用ParallelOld收集器
-XX:+UseParallelOldGC
老年代使用Parallel Old收集器,该收集器只能配合PS收集器进行使用
-XX:MaxGCPauseMillis=<value>
GC最大停顿时间(参考值)
-XX:GCTimeRatio=<value>
GC执行时间占比,计算公式为1/(1+value),和平常理解有点不一样,value默认值为99,即1%的时间用在GC上
-XX:+UseAdaptiveSizePolicy
启用自适应大小策略,开启此选项,JVM会自动根据统计信息设置Eden/Survivor以及晋升老年代的年龄,不需要手动进行设置
-XX:ParallelGCThreads=<value>
GC并行线程个数,默认情况下等于CPU核心数,但是当CPU核心数大于8时,使用公式3+5*CPU/8
CMS
-XX:+UseConcMarkSweepGC
老年代使用CMS收集器,若只使用此选项选择GC,新生代默认使用ParNew收集器,在JDK9之前可以使用-XX:-UseParNewGC指定新生代使用Serial收集器,但是JDK9之后不再支持
-XX:-CMSPrecleaningEnabled
关闭预清理,默认打开
-XX:ParallelGCThreads=<value>
并行线程数,初始标记和最终标记都可以设置为多线程并行执行,此参数应该就是这个作用
-XX:ConcGCThreads=<value>
并发线程数,并发标记和并发清除可以设置多个线程进行执行
-XX:CMSInitiatingOccupancyFraction=<value>
老年代使用率达到多少时触发CMS,默认值为68;当内存使用速率较快时,此值可以设置小一些,若速率较慢,则可以大一些,避免频繁的FullGC
-XX:+UseCMSCompactAtFullCollection
设置每次执行完CMS后都进行内存碎片整理
-XX:CMSFullGCsBeforeCompaction=<value>
设定执行几次CMS后,下次CMS收集前先进行内存碎片整理
-XX:+CMSClassUnloadingEnabled
开启对类元数据进行回收
-XX:CMSInitiatingPermOccupancyFraction=<value>
当永久区占用率达到这一百分比时,启动 CMS 回收(前提是 -XX:+CMSClassUnloadingEnabled 激活了)
-XX:+UseCMSInitiatingOccupancyOnly
表示只在到达阈值的时候才进行 CMS 回收
-XX:CMSWaitDuration=<value>
CMS定时扫描Old区,此值可以设置每个多少秒进行扫描,默认值为2s
-XX:+CMSScavengeBeforeRemark
开启CMS进行remark之前先及执行一次MinorGC,使得New Gen中的对象变少,这样remark阶段会扫描较少的新生代对象
注:在开启了这个选项之后,MinorGC时,可能导致Promotion Failure,那么Survivor中的to区域就不再是空的了,这样就会触发backgroud collector,问题参见JVM发生频繁 CMS GC,罪魁祸首是这个参数!
G1
-XX:+UseG1GC
开启G1垃圾收集器,JDK9以及后续默认使用的垃圾收集器
-XX:MaxGCPauseMillis=<value>
GC最大停顿时间
-XX:ParallelGCThreads=<value>
并行GC线程数
-XX:InitiatingHeapOccupancyPercent=<value>
指定当堆内存使用率达到多少时,触发并发标记周期的执行,默认值为45,如果此值过大,会导致频繁触发FullGC,此值如果过小,或导致频发触发标记,GC线程频繁抢占
通用GC参数
-XX:+-DisableExplicitGC
+表示禁用显式GC(System.gc()),System.gc()默认会触发FullGC,并且忽略参数中的UseG1GC和UseConcMarkSweepGC,因此必要时可以禁用此方法
-XX:+ExplicitGCInvokesConcurrent
显式GC调用时,不使用FullGC,而是使用设置的并发收集器进行收集
-XX:-ScavengeBeforFullGC
-XX:MaxTenurningThreshold=<value>
晋升为老年代的对象年龄阈值,默认值为15
-XX:TargetSurvivorRatio=<value>
相同年龄占用survivor区的比率为此值时,该年龄以及大于此年龄的对象直接晋升至老年代,默认值为50%
-XX:PretenureSizeThreshold=<value>
直接晋升为老年代的大对象大小阈值,单位为字节。改参数只对ParNew和Serial新生代收集器有效,而对Parallel Scavenge无效,即PS收集器此值默认为0,而大对象的大小由运行时动态调整。
-XX:-UseTLAB
禁用线程本地分配缓存,TLAB-Thread Local Allocation Buffer
-XX:TLABSize=<value>
设置TLAB大小,单位???
-XX:+PrintTLAB
跟踪TLAB的使用情况,用以确定TLAB的大小
-XX:+ResizeTLAB
自动调整TLAB大小
GC日志参数
-XX:+PrintGC
打印gc日志
-XX:+PrintGCDetails
打印详细的gc日志
-XX:+PrintHeapAtGC
在GC前后打印堆信息
-XX:+PrintGCDateStamps
打印gc日志的时间戳
-XX:+PrintGCTimeStamps
打印此次gc距离jvm启动的时间间隔
-XX:+PrintGCApplicationConcurrentTime
打印此次gc与应用程序之间的并发执行时间
-XX:+PrintGCApplicationStoppedTime
打印此次gc应用程序暂停时间
-XX:+PrintReferenceGC
跟踪软引用,弱引用,虚引用和Finalizer队列
-Xloggc:<filepath>
将gc日志输出到指定文件
-verbose:gc
打印gc日志
-XX:+PrintTenuringDistribution
对象晋升的日志
-XX:+HeapDumpOnOutOfMemoryError
出现oome时,对内存进行dump