什么是 STW ?
STW 全称:Stop-The-World
翻译过来就是:世界停止
STW 是垃圾回收算法执行的过程
也就是停止所有业务线程,开启回收线程;
Serial new、Serial old
Serial new新生代 + Serial old 老年代;
这俩种垃圾回收器一般是同时存在的;
也算是 JVM 最早的垃圾回收器;
以前我们的垃圾很少,只有几M到几十M;
所以使用单线程来实现;
Parallel Scavenge、Parllerl Old
Parallel Scavenge新生代 + Parllerl Old老年代;
当垃圾数据越来越多, Serial new、Serial old 已经不能满足我们的需求;
试想一下 STW 以前只需要几MS,到现在每次回收需要几S,甚至更久,这样我们的项目就会一直卡着;
所有出现了Parallel Scavenge、Parllerl Old组合模式;
以前 Serial new、Serial old 单线程,一个一个去扫去清理;
现在 ParNew、Parllerl Old 采取并行多线程,这样效率就高多了;
当然也会对服务器要求变高
这也是JDK 8默认的
Concurrent GC(CMS+ParNew)
CMS老年代 + ParNew新生代
业务线程和GC线程同时执行;
在初始标记/重新标记是STW,只是标识一下GC Roots能直接关联的对象,也就是只找根,很快;
并发标记:使用三色标记算法(下面又说);但是容易漏标;
然后找到所有白色的数据并发清理掉
三色标记算法
一进来通过来时通过 外部 一层一层扫描循环
黑色代表已经标记,自己孩子也标记完了;
灰色代表标记完成,自己孩子还没标记完;
白的代表没有标记到的节点
当A有俩个成员属性a,b时
m1(垃圾回收线程)先标记属性a
这个时候业务线程进来把a指向D 同时执行
然后重点来了,m2(垃圾回收线程)进来以为A已经标记完了,标记为灰色 同时执行
这个时候m1(垃圾回收线程)认为所有属性都标完了,把A设为黑色,结果D漏标了