一、cms 收集器
cms 作为一款用户线程和收集线程并发执行的收集器,其设计理念是能够减少停顿时间(低停顿),那么怎么才能减少呢?最好的方式就是能够充分利用cpu,能够并发的去执行(多线程)。
用户线程也在执行?对象的引用地址不是会被改变吗?如果改变了堆中对象的内存地址,将导致用户线程无法定位到引用对象,从而导致无法正运行,什么样的算法会在执行过程不会改变对象呢?
想一想 jvm回收的算法:
1、标记清理(好像只是标记,然后清楚,原对象并没有被移动),虽然会产生内存碎片
2、复制(将内存一分为二,并将存活的对象复制到另一个内存块),很明显对象将被移动,不可以
3、标记整理(将存活动对象移到一端,从另一端进行清理),很明显对象也被移动了,不可以
通过分析这三种算法,好像只有 第一种满足cms的设计理念,因此即使有缺陷,但为了能够并行,cms还是选择了清记清除算法。
cms 收集过程
初始标记->并发标记->重新 标记->并发清理
下面理解下这四个过程:
1、初始标记:独占CP