JVM-垃圾回收器
JVM——垃圾回收器
1. 垃圾回收器分类
分类标准:串行/并行、并发/独占、压缩式/非压缩式、年轻代/老年代
2. 回收器评价标准
- 吞吐量:$\frac{t_{运行用户代码}}{t_{运行用户代码} + t_{垃圾回收}}$,即尽可能让单位时间内的STW时间最短
- 暂停时间:尽可能让单次STW时间最短
3. Serial回收器
串行;年轻代为Serial(标记-复制算法),老年代为Serial Old(标记-整理算法)
4. ParNew回收器
并行;只能用于年轻代(标记-复制算法),老年代仍为Serial-Old
5. Parallel Scavenge回收器
并行;关注吞吐量;年轻代为Parallel Scavenge(标记-复制算法),老年代为Parallel Old(标记-整理算法)
6. CMS回收器(Concurrent-Mark-Sweep)
并发;只能用于老年代,但无法与Parallel Scavenge一起使用
CMS回收器收集流程
- 初始标记:只标记出与GCRoots直接关联的对象,会发生STW但时间短
- 并发标记:从上面得到的与GCRoots直接关联的对象开始遍历标记,可与工作线程并发执行,无需STW
- 重新标记:修正并发标记过程中,由于用户程序继续运行导致标记产生变动的一部分对象的标记记录,会产生STW但时间也不长
- 并发清除:删除标记阶段判断死亡的对象,由于没移动对象(标记-清除),故可以与用户线程并发执行
- 优点:并发;低延迟
- 缺点:
- 由于采用的是标记-清除算法,会产生内存碎片;
- 会产生**“浮动垃圾”**:由于并发清除阶段是与工作线程并发执行的,这期间产生的垃圾要等到下次gc次才能清除
7. G1回收器(Garbage First)
G1回收器将堆内存分割为许多个小区域region,G1跟踪各个region里垃圾堆积价值大小(回收获得空间大小 以及 回收所需时间的经验值),在后台维护一个优先列表,每次根据允许时间,优先回收价值最大的region
G1回收器收集流程:
- 初始标记
- 并发标记
- 重新标记
- 筛选回收:制定回收计划,选择多个region作为回收集,把回收集中存活对象复制到空的region中,再清理旧region中的全部空间,需要STW
8. CMS G1垃圾回收器的三色标记是什么?
三色标记是用于垃圾回收的标记算法,CMS 和 G1 垃圾回收器都有采用。它将对象分为三种颜色:
白色:初始状态,代表尚未被垃圾回收器访问的对象。标记结束仍为白色的对象,意味着未被程序引用,会被当作垃圾回收。
灰色:表示对象已被访问,但它引用的其他对象还没全被访问,处于“中间状态”。
黑色:对象及其引用的所有对象都已被访问过。黑色对象在本轮标记中不会被回收。
三色标记能在并发标记时,和用户线程并发执行,提高效率,但可能产生浮动垃圾和对象消失问题。
JVM-垃圾回收器
http://example.com/2025/05/16/JVM-垃圾回收器/