【JVM虚拟机篇12】垃圾回收器

85 阅读4分钟

垃圾回收器:

  • 串行垃圾回收器
  • 并行垃圾回收器
  • CMS(并发)垃圾回收器
  • G1垃圾回收器

串行垃圾回收器

Serial和Serial old 串行垃圾回收器,是指使用单线程进行垃圾回收,堆内存较小,适合个人电脑

  • Serial 作用于新生代,采用赋值算法
  • Serial old 作用于老年代,采用标记-整理算法

垃圾回收时,只有一个线程在工作,并且java应用中所有线程都要暂停,等待垃圾回收的完成

image.png

并行垃圾回收器

Parallel New和Parallel Old是并行垃圾回收器,JDK8默认使用此垃圾回收器

  • Parallel New 作用于新生代,采用复制算法
  • Parallel Old 作用于老年代,采用标记-整理算法

垃圾回收时,多个线程在工作,并且java应用中所有线程都要暂停,等待垃圾回收的完成

image.png

CMS(并发)垃圾回收器

使用标记-清除算法的垃圾回收器,该回收器是针对老年代垃圾回收的,是一款以获取最短回收停顿时间为目标的收集器,停顿时间短,用户体验好/最大特点是进行垃圾回收时,应用仍然能正常运行。

image.png

G1垃圾回收器【JDK9之后默认使用G1】

  • 划分成多个区域,每个区域都可以充当eden、survivor、old、humongous,其中 humongous专门为大对象准备的
  • 采用复制算法
  • 响应时间和吞吐量兼顾
  • 分为三个阶段:新生代回收、并发标记、混合收集
  • 如果并发失败(即回收速度赶不上创建新对象速度),就会创建Full GC

image.png

新生代回收(Young Collection)

  • 初始时,所有区域都处于空闲状态
  • 创建了一些对象,挑出一些空闲区域作为伊甸园区存储这些对象
  • 当伊甸园区要垃圾回收时,挑出一个空闲区域作为幸存者区,用复制算法复制存活对象,需要暂停用户线程

image.png

  • 随着时间流逝,伊甸园的内存又不足
  • 将伊甸园以及之前幸存区中的存活对象,采用复制算法,复制到新的幸存区,其中比较老对象晋升至老年代

image.png

并发标记(Young Collection + Concurrent Mark)

当老年代占用内存超过阈值(默认是45%)后,触发并发标记,这时无需暂停用户线程

image.png

  • 并发标记之后,会有重新标记阶段解决遗漏问题,此时需要暂停用户线程
  • 这些都完成后就知道老年代有哪些存活对象,随后进入混合收集阶段。此时不会堆所有老年代区域进行回收,而是根据暂停时间目标优先回收价值高(存活对象少)的区域(这也是Cabage First名称的由来)

image.png

混合收集(Mixed Collection)

混合收集阶段中,参与复制的有eden、survivor、old

image.png

G1 总结

image.png