垃圾回收算法(三种)

JVM垃圾回收基础

我们知道,怎样判断一个对象是否是垃圾,主要是看它是否GC Root 对象所引用。大家可以看一下Java中的四种引用
如果未被GC Root对象所引用,那么看它是哪种引用,判断是否需要垃圾回收。我们看到上图中被GC Root实线连接都是不用被垃圾回收的。而未被GC Root直接连接的就是需要可能被垃圾回收。这时怎样去垃圾回收需要一种方法,这就需要垃圾回收算法。

标记清除

JVM垃圾回收基础
我们看到上图中被GC Root实线连接都是不用被垃圾回收的。而未被GC Root直接连接的就是需要可能被垃圾回收。

  • 标记清除算法分为两个阶段:
  1. 标记:将没有被GC Root直接引用的对象标记出来如下图
    JVM垃圾回收基础
  2. 清除:将标记出来区域进行清除。
    JVM垃圾回收基础
  • 标记清除算法优缺点
    优点: 速度快
    缺点:容易造成内存碎片化,清除后没有对内存空间进行整理。

标记整理

标记整理相对于标记清除,它的第二部加上了整理,将占用的内存整理成连续的一块内存。

  1. 标记
    JVM垃圾回收基础
  2. 整理+清除
    JVM垃圾回收基础
  • 优缺点
    缺点:由于牵扯内存的移动,那么速度必定较为慢。
    优点:内存不会碎片化。

复制算法

复制算法将我们内存区域划分成大小相等的两片区域,左边区域叫FROM,右边区域叫TO如下图。
JVM垃圾回收基础

  1. 第一步将FROM区域中和GCRoot关联的不需要垃圾回收的区域挪到TO区域,如下图:
    JVM垃圾回收基础
  2. 交换FROM和TO 的位置,原来的FROM变为TO原来的TO变为FROM,如下图:
    JVM垃圾回收基础
  • 优缺点
    优点:没有内存碎片化。
    缺点:需要占用双倍的内存空间。

  • 总结:在JVM中,不是说使用一种算法来进行垃圾回收,会使用几种算法配合来进行垃圾回收,具体就是虚拟机的分代垃圾回收机制。

分代垃圾回收机制

分代垃圾回收机制将内存划分为,老年代和新生代,而新生代又划分为几个区域,具体如下图:
JVM垃圾回收基础
Java中需要长时间使用的对象放入老年代中,而用完就丢弃的对象可以放入新生代。

  • 第一次垃圾回收(伊甸园第一次快满)
  1. 当我们新创建一个对象的引用,放入伊甸园。
  2. 当伊甸园快满时,就触发一次MinGC垃圾回收,这时将不要被回收的引用放入幸存区TO(会让幸存区的对象寿命+1)
  3. 交换幸存区FROM和TO的位置。
  • 第二次垃圾回收(伊甸园再次快满)
  1. 伊甸园满了再次触发垃圾回收
  2. 将伊甸园中不需要垃圾回收的放入TO中,检查FROM中是否有需要垃圾回收的引用
  3. 垃圾回收
  4. FROM和TO换位置
  • 晋升老年代
  1. 当发现幸存区FROM中有引用的寿命到达一个设定的值,那么就将这个引用晋升老年代。
  • 完全垃圾回收
  1. 如果新生代,老年代都不足,触发完全垃圾回收

JVM垃圾回收基础

相关文章:

  • 2021-06-05
  • 2021-06-10
  • 2022-12-23
  • 2021-10-21
  • 2021-05-15
  • 2021-12-13
猜你喜欢
  • 2021-09-29
  • 2022-01-01
  • 2021-11-04
  • 2021-11-02
  • 2021-06-15
  • 2021-11-18
  • 2021-04-09
相关资源
相似解决方案