CMS相关flag-1

CMS被设计为尽可能的减少jvm停顿时间的垃圾收集器,使用标记-清除算法思想,其gc周期分为以下几个过程:

  1. Initial Mark:初始标记,单线程,这个过程是需要整个jvm停顿的也即STW,标记从GC Roots可达的老年代对象,这个阶段一般来说暂停时间非常短,这个过程其实只是找到存活对象的引线,用来下个阶段递归标记。

  2. Concurrent Mark:并发标记,这个过程不需要STW,从上个阶段的引线对象开始递归遍历所有可达对象,由于这个过程是并发标记,这个阶段有可能会出现对象晋升、引用关系变化等,这些会在后面的阶段进行修正。

  3. Concurrent Preclean:并发预清理,处理阶段2发生的引用变化,阶段2是并发的,这里进行修正。

  4. Remark:并发重新标记,STW,阶段3也是并发的,这里暂停所有工作线程再次进行标记修正。

  5. Concurrent Sweep:并发清理,清理掉不在被引用的对象。

  6. Concurrent Reset:做一些收尾工作,为下次gc做准备。

-XX:+UseConcMarkSweepGC

CMS垃圾收集器开关,CMS并不是默认收集器,需要手动开启

-XX:+UseParNewGC

当开启了CMS垃圾收集器时,新生代默认会开启这个选项,并不用显式设置,它也是除了Serial收集器之外唯一能与CMS配合工作的年轻代收集器。

-XX:+CMSConcurrentMTEnabled

这个开关仅仅是开启多线程垃圾收集而已,默认是开启的,一般不用设置。

-XX:ConcGCThreads=

设置CMS并发的线程数,其默认值为ConcGCThreads = (ParallelGCThreads + 3)/4,实际使用时可先不设置这个参数,测试调优后再设置其值。

-XX:CMSInitiatingOccupancyFraction= -XX:+UseCMSInitiatingOccupancyOnly

设置CMS GC的触发时机,也就是老年代内存占用比例到这个设定的值百分比时触发FGC,默认是68,即68%,但是仅仅设置这个值时只会在第一次使用这个值,如果希望每次都使用这个值还需要设置-XX:+UseCMSInitiatingOccupancyOnly

-XX:+CMSClassUnloadingEnabled

开启或者关闭CMS对永久代的清理,JDK7默认关闭而JDK8打开,早期的jvm需要额外设置-XX:+CMSPermGenSweepingEnabled,如果不开启这个参数永久代耗尽会进行FULL GC(包括young gen、old gen、perm gen)收集整个堆。如果动态加载的类不多可以关闭这个参数,他会增加CMS的暂停时间。

-XX:+CMSIncrementalMode

CMS增量收集模式,基本不用。

-XX:+ExplicitGCInvokesConcurrent and -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses

手动调用gc时使用CMS收集器,例:system.gc(),不设置这个参数会默认触发FULL GC,ExplicitGCInvokesConcurrentAndUnloadsClasses这是指明将永久代也一并收集了。

-XX:+DisableExplicitGC

禁用手工调用gc,例:system.gc()。如果不用垃圾类库这个可以不设置。不确定的话还是设置了吧。

-XX:MaxTenuringThreshold=

经理过多少次YGC后晋升老年代,CMS默认是6,如果比较了解自己应用的特性可以将这个参数设短,可显著提升YGC性能

-XX:+ParallelRefProcEnabled -XX:+CMSParallelInitialMarkEnabled -XX:+CMSParallelRemarkEnabled

ParallelRefProcEnabled让jvm并行处理Reference对象(例:WeakReference),默认不开启。

CMSParallelInitialMarkEnabled初始标记阶段并行处理,jdk8默认开启。

CMSParallelRemarkEnabled 重新标记阶段并行处理,jdk8默认开启。

-XX:+CMSScavengeBeforeRemark

在CMS remark前执行一次minor GC,默认不开启,会使停顿时间变长,谨慎开启。

-XX:+UnlockDiagnosticVMOptions -XX:ParGCCardsPerStrideChunk=1024

ParGCCardsPerStrideChunkParNew算法中每个线程处理的年轻代与老年代关联的CardTable数量,默认是256,当老年代比较大时建议增大这个值,要使这个值生效需要

同时加参数-XX:+UnlockDiagnosticVMOptions,这个参数需要不断尝试来确定合适值。参考占小狼的博客

你可能感兴趣的:(CMS相关flag-1)