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

Posted 黄先生的日志

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java专题二十二:垃圾回收(GC)相关的知识,希望对你有一定的参考价值。

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收集器

多线程版本的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)的主要内容,如果未能解决你的问题,请参考以下文章

53.垃圾回收算法的实现原理启动Java垃圾回收Java垃圾回收过程垃圾回收中实例的终结对象什么时候符合垃圾回收的条件GC Scope 示例程序GC OutOfMemoryError的示例

java中是怎样进行垃圾回收的?

Java垃圾回收机制是啥?

Java垃圾回收机制(GC)详解

Java 垃圾回收(GC) 泛读

JVM专题--垃圾回收算法, 垃圾回收器