可以做推广东西的网站,ie浏览器在线使用,wordpress线报主题,驰够网官方网站文章目录 1. 垃圾回收器2. CMS 原理3. 三色标记算法 1. 垃圾回收器 ① Serial#xff1a;最原始的垃圾回收器#xff0c;用于新生代#xff0c;是单线程的#xff0c;GC 时需要停止其它所有的工作#xff0c;算法简单#xff0c;但它只能在内存较小时勉强使用#xff1b… 文章目录 1. 垃圾回收器2. CMS 原理3. 三色标记算法 1. 垃圾回收器 ① Serial最原始的垃圾回收器用于新生代是单线程的GC 时需要停止其它所有的工作算法简单但它只能在内存较小时勉强使用 ② Serial Old跟 Serial 配合使用用于老年代也是单线程 ③ Parallel Scavenge属于并行多线程用于新生代多个 GC 线程一起工作但是业务线程必须停着 ④ Parallel Old跟 Parallel Scavenge 一起使用用于老年代并行多线程 ⑤ CMS真正意义上的并发收集器GC 线程与业务线程并发执行老年代 ⑥ Parnew本质上是 Parallel Scavenge 的改进版专门用来配合 CMS 使用新生代。 2. CMS 原理
① 初始标记
初始标记找到根上的对象属于 STW。
在 STWStop-The-World状态下除了 GC 线程外其他业务线程都将停止工作
② 并发标记
业务线程继续执行GC 线程独立开始工作。
③ 重新标记 针对并发标记所产生的错标问题我们需要对它进行修正这个修正过程叫做重新标记也属于 STW。
④ 并发清理
清理掉需要回收的垃圾。
3. 三色标记算法 三色标记算法用在并发标记阶段标记清除中的标记过程用的就是三色标记。当能扫描到的对象都变成黑色的时候就代表扫描完了其余扫描不到的对象都是垃圾
黑色自己被标记孩子也被标记下次 GC 时自己和孩子都不会再扫描。
灰色灰色是黑色的孩子灰色自己被标记了但是它的孩子还没有被标记下次 GC 时不扫自己扫孩子。
白色白色是没有遍历到的节点自己都没有被标记到。 由于业务线程和 GC 线程都在不间断地运行这势必会出现一些不可预测的问题 ① B → D 消失的情况这种情况不算严重。当经历了一次 GC 扫描之后扫描完了 A 和 B还没来得及扫描白色对象 D 的时候B 指向 D 的引用突然消失了就会导致 D 成为浮动垃圾下一次扫描的时候会直接被当成垃圾扫描出来 ② B → D 消失但是 A → D 增加这是最严重的的一种情况。A、B 扫描完但是还没来得及扫描到 C业务代码就开始运行B 指向 D 的引用突然消失了与此同时A 指向 D 的引用增加了。因为 A 是黑色对象当第二次 GC 的时候它以及它的孩子 D 都不会被扫描到而 B 到 D 也没有任何引用这就导致 D 对象并没有被扫描到它自然就被当成了一个垃圾。解决办法就是修改黑色对象 A 为灰色这样下一次扫描的时候就会扫描到它的孩子 D 了。这种解决方案叫做 Incremental Update但是这种方案也有漏标的可能性所以最终 CMS 还得进行一次重新标记才可以重新标记的过程是 STW阻止业务线程运行牺牲运行效率换取标记无误。