Java专题二十二:垃圾回收(GC)

2021-05-13 03:30

阅读:579

标签:算法   分代   region   相同   垃圾回收   ade   class   这一   时间短   

Java专题二十二:垃圾回收(GC)

目录
  • 22.1. 垃圾回收算法
    • 22.1.1. 复制算法
    • 22.1.2. 标记-清除算法
    • 22.1.3. 标记-整理算法
    • 22.1.4. 分代收集算法
  • 22.2. 垃圾回收器
    • 22.2.1. Serial收集器
    • 22.2.2. ParNew收集器
    • 22.2.3. Serial Old收集器
    • 22.2.4. Parallel Scavenge收集器
    • 22.2.5. Parallel Old收集器
    • 22.2.6. CMS收集器
    • 22.2.7. G1收集器

22.1. 垃圾回收算法

22.1.1. 复制算法

复制算法将内存按容量划分为大小相等的两块,每次只使用其中的一块,当这一块内存用完了,就将还存活着的对象复制到另一块上面,然后再把已经使用过的内存空间一次清理掉

22.1.2. 标记-清除算法

标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段

  • 标记阶段:通过根节点,标记所有从根节点开始的可达对象
  • 清除阶段:清除所有未被标记的对象。

22.1.3. 标记-整理算法

标记-整理算法与标记-清除算法类似

  • 标记阶段:通过根节点,标记所有从根节点开始的可达对象
  • 整理清除阶段:先将被标记的对象(存活的)移到一端,再清除边界以外的内存

22.1.4. 分代收集算法

根据对象存活周期的不同将内存划分为新生代和老年代,又根据其特点采用不同收集算法,一般情况如下:

  • 新生代:复制算法
  • 新生代:标记-清除或标记-整理算法

22.2. 垃圾回收器

22.2.1. Serial收集器

  • 作为新生代收集
  • 基于复制算法
  • 单线程执行垃圾回收,回收时,程序会暂停手上的工作,然后单线程执行垃圾回收

22.2.2. ParNew收集器

多线程版本的Serial收集器

22.2.3. Serial Old收集器

  • Serial收集器的老年代版本,作为老年代收集
  • 基于标记-整理算法
  • 单线程执行垃圾回收,回收时,程序会暂停手上的工作,然后单线程执行垃圾回收

22.2.4. Parallel Scavenge收集器

  • 作为新生代收集
  • 并行多线程收集
  • 基于复制算法
  • 追求高的垃圾回收吞吐量(总时间与垃圾回收时间的比例)

22.2.5. Parallel Old收集器

  • Parallel Scavenge收集器的老年代版本,作为老年代收集
  • 并行多线程收集
  • 基于标记-整理算法
  • 追求高的垃圾回收吞吐量(总时间与垃圾回收时间的比例)

22.2.6. CMS收集器

CMS收集器(Concurrent Mark Sweep)

  • GC工作线程与用户线程可以并发执行
  • 仅作为老年代收集
  • 基于标记-清除算法
  • 停顿时间短(STW: stop the world, 程序暂停去执行垃圾回收线程)

22.2.7. G1收集器

将内存分为多个大小相同的区域Region,每个Region拥有各自的分代属性(新生代、存活代、老年代)
G1对于每个Region都维护一个Remembered Set,用于记录对象引用的情况。当GC发生的时候根据Remembered Set的引用情况去搜索

Java专题二十二:垃圾回收(GC)

标签:算法   分代   region   相同   垃圾回收   ade   class   这一   时间短   

原文地址:https://www.cnblogs.com/myibu/p/13132051.html


评论


亲,登录后才可以留言!