JVM-垃圾回收算法

110 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

介绍一下回收算法?

  • 标记-清除算法:该算法分为“标记”和“清除”阶段,首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象。效率很快但是会产生碎片化空间
  • 标记-复制算法:该算法可以将内存分为大小相同的两块,每次只使用其中的一块。当这一块的内存使用完后(from),就将还存活的对象复制到另一块去(to),然后再把使用的空间一次清理掉,接着from-to两块角色互换
  • 标记-整理算法:标记过程仍然与“标记-清除”算法一样,接着将所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。

回收过程:

  • 对象首先分配在伊甸园区域

  • 新生代空间不足时,触发 minor gc,伊甸园和 from 存活的对象使用 copy 复制到 to 中,存活的 对象年龄加 1并且交换 from to

  • minor gc 会引发 stop the world,暂停其它用户的线程,等垃圾回收结束,用户线程才恢复运行

  • 当对象寿命超过阈值时,会晋升至老年代(或者当新生代空间不足时),最大寿命是15(4bit)

  • 当老年代空间不足,会先尝试触发 minor gc,如果之后空间仍不足,那么触发 full gc,STW的时间更长

垃圾回收器

CMS

  • CMS 收集器是一种 “标记-清除”算法实现的垃圾收集器
  • 分为四步:
    • 初始标记: 暂停所有的其他线程,并记录下直接与 root 相连的对象,速度很快
    • 并发标记: 同时开启 GC 和用户线程,记录可达对象。可以与用户线程并发执行
    • 重新标记: 重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录
    • 并发清除: 开启用户线程,同时 GC 线程开始对未标记的区域做清扫。

G1收集器

G1 收集器的运作大致分为以下几个步骤:

  • 初始标记
  • 并发标记
  • 最终标记
  • 筛选回收

思想:

  • 将内存区域看成一个个等分的Region, 当筛选回收的时候,优先回收垃圾最多的Region
  • 整体上是 标记+整理 算法,两个区域之间是复制算法

G1什么时候发生Full GC?

  • Region垃圾达到阈值(45%),且生产垃圾的速度大于并发收集速度的时候