-server (年轻代采用并行清理)
-XX:+UseConcMarkSweepGC (设置年老代为并发收集,激活CMS收集器)
-Duser.timezone=UTC-Xloggc:/usr/src/app/log/gc.log
-XX:+CMSClassUnloadingEnabled (年老代启用CMS,但默认是不会回收永久代(Perm)的。此处对Perm区启用类回收,防止Perm区内存满。(需要与+CMSPermGenSweepingEnabled同时启用)。)
-XX:+HeapDumpOnOutOfMemoryError (当堆出现内存错误时,保存堆快照信息)
-XX:HeapDumpPath=/usr/src/app/log/heapdump.hprof (快照地址)
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+PrintTenuringDistribution
(CMS的触发条件)
-XX:+UseCMSInitiatingOccupancyOnly (没有设置,虚拟机会根据收集的数据决定是否触发CMS,加上这个参数控制老生代使用比例是否进行CMS)
-XX:CMSInitiatingOccupancyFraction=70 (老生代使用率达到阀值,默认是92%,必须配合+UseCMSInitiatingOccupancyOnly一起使用)
-XX:+CMSParallelInitialMarkEnabled(由于CMS算法收集垃圾的第一阶段初始标记是会引起程序暂停(STW),通过这个参数可以开启并行标记,使用多个线程标记,从而减少暂停时间)
-XX:+CMSParallelRemarkEnabled (作用于CMS的第五阶段重新标记,可以开启并行标记,加快标记速度)
-XX:+CMSScavengeBeforeRemark (作用于CMS的第五阶段重新标记,加上这个参数强制在进行重新标记的时候进行一次YoungGC)
-XX:+UseFastAccessorMethods (原始类型的快速优化)
-XX:+UseCMSCompactAtFullCollection(作用于CMS的阶段六,是否打开对老生代对象的压缩,CMS默认上是不会整理堆碎片的,开启对内存整理压缩,避免产生内存碎片)
-XX:CMSFullGCsBeforeCompaction=2 (用于CMS的阶段六,如果每次进行Full GC都进行压缩处理,那就有点浪费性能了,这个参数控制每几次Full GC后进行压缩处理)
-XX:MaxMetaspaceSize=256m (这里并不能指定原数据空间的大小,设置这个值表达的意思是,当原数据空间扩容达到指定的阀值,就会触发一次Full GC,以后的扩容都会触发)
-XX:NewRatio=2 (老生代与年轻代的比值)
-XX:SurvivorRatio=8(新生代中E区和S区的比值,在新生代中S0和S1必定有一个为空)
-XX:ConGCThreads=N(控制运行CMS的线程数量,默认情况:ConcGCThreads=(3+ParallelGCThreads)/4,)
CMS(Concurrent Mark-Sweep Collector)
一:使用并发收集
二:使用的收集算法 mark-Sweep(标记清除),会产生零散碎片
CMS回收的是老生代的对象
阶段一:初始标记,重点是遍历从GCROOT直接关联的老年代对象,再就是年轻代直接关联的老年代对象
阶段二:并发标记,从上个阶段标记的对象出发,把可以到达的对象都标记上
阶段三:预清理
阶段四:可中断预处理
阶段五:重新标记
阶段六:并发清理
阶段七:并发重置