CMS在执行一次垃圾回收的过程一共分为4个阶段
1、初始标记:标记由4种(1:虚拟机(JVM)栈中引用对象 2:方法区中的类静态属性引用对象 3:方法区中常量引用的对象(final 的常量值) 4:本地方法栈JNI的引用对象)gc roots直接关键的对象;
2、并发标记:对老年代所有的对象进行追踪,看看是否能与GC Roots建立关系;
3、重新标记:标记并发标记阶段引用变动的对象;
4、并发清理:并发清理掉可回收的内存,但是因为与用户线程并行运行,所以每次Full GC都会清理不干净,产生浮动垃圾。
只有1和3阶段是需要"Stop The World"的,CMS的垃圾回收机制尽可能的性能优化了,因为最耗时的,其实就是对老年代全部对象进行GC Roots追踪,标记出来到底哪些可以回收,然后就是对各种垃圾对象从内存里清理掉,这是最耗时的
你的鼓励是我分享技术最大的动力!如有错误之处,请指正,不胜感激。