JVM 基础GC算法

什么是 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漏标了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值