zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Java垃圾搜集器

JAVA 垃圾 搜集
2023-09-11 14:22:28 时间

按照线程数量来分:

  1. 串行 串行垃圾回收器一次只使用一个线程进行垃圾回收
  2. 并行 并行垃圾回收器一次将开启多个线程同时进行垃圾回收。

按照工作模式来分:

  1. 并发 并发式垃圾回收器与应用程序线程交替工作,以尽可能减少应用程序的停顿时间
  2. 独占 一旦运行,就停止应用程序中的其他所有线程,直到垃圾回收过程完全结束

按照碎片处理方式:

  • 压缩式 压缩式垃圾回收器会在回收完成后,对存活对象进行压缩整消除回收后的碎片;
  • 非压缩式 非压缩式的垃圾回收器不进行这步操作。

按工作的内存区间 可分为新生代垃圾回收器和老年代垃圾回收器

  • 新生代串行收集器 serial 它仅仅使用单线程进行垃圾回收;第二,它独占式的垃圾回收。使用复制算法。

  • 老年代串行收集器 serial old 年代串行收集器使用的是标记-压缩算法。和新生代串行收集器一样,它也是一个串行的、独占式的垃圾回收器

  • 并行收集器 parnew 并行收集器是工作在新生代的垃圾收集器,它只简单地将串行回收器多线程化。它的回收策略、算法以及参数和串行回收器一样并行回收器也是独占式的回收器,在收集过程中,应用程序会全部暂停。但由于并行回收器使用多线程进行垃圾回收,因此,在并发能力比较强的 CPU 上,它产生的停顿时间要短于串行回收器,而在单 CPU或者并发能力较弱的系统中,并行回收器的效果不会比串行回收器好,由于多线程的压力,它的实际表现很可能比串行回收器差。

  • 新生代并行回收 (Parallel Scavenge) 收集器新生代并行回收收集器也是使用复制算法的收集器。从表面上看,它和并行收集器一样都是多线程、独占式的收集器。但是,并行回收收集器有一个重要的特点:它非常关注系统的吞吐量。

  • 老年代并行回收收集器 parallel old老年代的并行回收收集器也是一种多线程并发的收集器。和新生代并行回收收集器一样,它也是一种关注吞吐量的收集器。老年代并行回收收集器使用标记-压缩算法,JDK1.6 之后开始启用。

  • CMS 收集器 CMS 收集器主要关注于系统停顿时间。CMS 是 Concurrent Mark Sweep 的缩写,意为并发标记清除,从名称上可以得知,它使用的是标记-清除算法,同时它又是一个使用多线程并发回收的垃圾收集器。

    • CMS工作时,主要步骤有:初始标记、并发标记、重新标记、并发清除和并发重置。其中初始标记和重新标记是独占系统资源的,而并发标记、并发清除和并发重置是可以和用户线程一起执行的。因此,从整体上来说,CMS收集不是独占式的,它可以在应用程序运行过程中进行垃圾回收。

    • 根据标记-清除算法,初始标记、并发标记和重新标记都是为了标记出需要回收的对象。并发清理则是在标记完成后,正式回收垃圾对象;并发重置是指在垃圾回收完成后,重新初始化CMS 数据结构和数据,为下一次垃圾回收做好准备。并发标记、并发清理和并发重置都是可以和应用程序线程一起执行的。

  • G1 收集器 G1 收集器是基于标记-压缩算法的。因此,它不会产生空间碎片,也没有必要在收集完成后,进行一次独占式的碎片整理工作。G1 收集器还可以进行非常精确的停顿控制。