垃圾回收算法和垃圾收集器

一、垃圾回收算法
当前的垃圾收集都采用分代收集算法,即年轻代和老年代用不同的算法,以更符合自身的特点

  1. 标记复制算法(年轻代young gc使用的就是标记复制算法):
    1. 将内存分为A、B两个区域,只用A区,B区闲置
    2. 当A区用完,则把A区标记的存活对象复制到B区,再清理A区,两个区域循环使用
    3. 速度快但是内存利用率低
  2. 标记整理算法:
    1. 标记内存中存活的对象
    2. 让存活的对象向内存的一端移动,清理掉边界以外的内存
  3. 标记清除算法:
    1. 标记内存中存活的对象,对未标记的对象进行清除
    2. 会产生大量不连续的内存碎片
  4. 标记复制比标记清除和标记整理速度要快很多,因为虽然标记复制算法也有标记两字,实际上并没有这个mark的过程,找到了存活对象直接移到另一个Survivor区就行

二、垃圾收集器

  1. Serial、Serial Old:只支持单线程的串行垃圾收集器,当垃圾回收线程执行的时候,会STW(暂停其他工作线程)
  2. Parallel、Parallel Old:相当于Serial收集器的多线程版本,支持多个垃圾线程并行工作,仍然会STW
  3. ParNew:与Parallel类似,但是可以与CMS配合使用
  4. CMS:不仅支持多线程,更支持工作线程与垃圾处理线程在一定程度上并行工作
  5. G1:与CMS功能类似,更适用于大内存,因为底层逻辑复杂,小内存中使用反而消耗更多效益

三、CMS与三色标记算法
CMS垃圾收集器的优势在于将垃圾收集过程中STW时间缩短到可以忽略
其实现方式是将整个垃圾回收分为五个阶段:初始标记、并发标记、重新标记、并发清理、并发重置,其中只有初始标记和重新标记阶段需要STW,而这两个阶段时间占比极低

  1. 初始标记:仅标记GCRoot直接引用的对象
  2. 并发标记:从GCRoot直接引用的对象开始往下查找,找到所有被引用的对象并进行标记
  3. 重新标记:由于并发标记阶段不会STW,对象引用动态变化,所以会出现多标和漏标的情况,需要进行重新标记,此阶段会STW
  4. 并发清理:清理对象的过程中,由于不会STW,所以如果有新增对象,只会被标记,不会被清理
  5. 并发重置:重置本次gc中的标记数据

CMS使用的垃圾回收算法是三色标记算法,主要为了解决并发标记与清理过程中所产生的多标和漏标现象

  1. 三色标记指在标记过程中,对不同状态的对象采用不同的标记
  2. 被引用且所有的引用都被扫描的对象标记为黑色,被引用但是仍有引用未被扫描的对象被标记为灰色,而剩下的对象则是白色,表示垃圾对象,只有白色对象才会被清理
  3. 标记并不是一成不变的,比如在并发标记时,对象A的引用已经被全部扫描,且对象A被标记为黑色,若在垃圾回收过程中,有新的引用指向对象A,在重新标记阶段,A会被重新标记为灰色

四、G1
G1逻辑上仍有分代的概念,但是物理上不再将内存划分为Eden、Survivor、Old三个区域,而是划分为不同的region区块,每块region区块会有标识
标识分为Eden、Survivor、Old、Humongous四种,在以前的分代基础上增加了大对象Humongous,专门存放年轻的大对象,避免老年代空间不够的问题
当前的region标识会随着对象的变化而变化,原本是Old,可能在一次gc后变成了Eden

G1的gc方式也分成三种:young gc、mixed gc、full gc
young gc并不会说当前年轻代的region满了后就立即触发,而是会先计算当前Eden区的清理时间,如果时间短,则会增加Eden区的region数量
其中mixed gc指清理全部年轻代的垃圾对象和部分老年代垃圾对象,目的是减少STW的时间
full gc则是以单线程的方式清除掉所有的垃圾对象,因此应该尽量减少full gc的次数

G1的垃圾回收过程在CMS的基础上做了一些改变,分为四个阶段:

  1. 初始标记:与CMS一致
  2. 并发标记:与CMS一致
  3. 最终标记:与CMS的重新标记一致
  4. 筛选回收:在正常清理的基础上进行了优化:
    1. 增加GC停顿时间,比如停顿时间为200ms,而回收完所有垃圾要400ms,那么只会回收一半的垃圾就停止
    2. 制定回收计划,对各个region的回收价值与成本进行排序,按优先级从高到低进行回收,以保证在停顿时间内,值得回收的region先被回收完成

G1采用的是回收复制算法,所以不会出现过多内存碎片的问题
但是由于G1的回收策略很复杂,不支持工作线程并发执行,即会有STW

五、读写屏障、增量更新、原始快照(先放着,还没总结)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值