jvm的参数,使用CMS的情况下

-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直接关联的老年代对象,再就是年轻代直接关联的老年代对象

阶段二:并发标记,从上个阶段标记的对象出发,把可以到达的对象都标记上

阶段三:预清理

阶段四:可中断预处理

阶段五:重新标记

阶段六:并发清理

阶段七:并发重置

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容