Java经典垃圾收集器

article/2025/11/5 4:03:36

经典垃圾收集器

      • 1.Serial收集器
      • 2.ParNew收集器
      • 3.Parallel Scavenge收集器
      • 4.Serial Old收集器
      • 5.Parallel Old收集器
      • 6.CMS收集器
      • 7.Garbage First收集器

1.Serial收集器

Serial收集器是最基础,历史最久远的收集器,是一款新生代收集器,新生代收集采用的是“标记-复制算法”;它的工作方式是“单线程”。此处的单线程不仅是指它只会用一个处理器或一条收集线程去完成垃圾收集工作,更重要的是强调它在垃圾收集的时候,必须暂停其他所有工作的线程,包括用户线程,知道它收集结束。所以说,“Stop The World”(STW)可不是白叫的。

2.ParNew收集器

ParNew收集器实际上是Serial收集器的多线程并行版本,从名字就可以看出它也是一款新生代的收集器。

但是此处的多线程并行不是说它可以没有SWT,下面解释一下收集器并发和并行的概念:

  • 并行(Parallel): 并行描述的是多条垃圾收集器线程之间的关系,说明同一时间有多条这样的线程在协同工作,通常默认此时用户线程是处于等待状态。
  • 并发(Concurrent):并发描述的是垃圾收集器线程与用户线程之间的关系,说明同一时间垃圾收集器线程与用户线程都在运行。由于用户线程并未被冻结,所以程序仍然能响应服务请求,但由于垃圾收集器线程占用了一部分系统资源,此时应用程序的处理的吞吐量将受到一定影响。
  • —摘自《深入理解Java虚拟机》

3.Parallel Scavenge收集器

Parallel Scavenge收集器也是一款新生代的收集器,同样基于“标记-复制算法”实现,工作方式也是并行收集的多线程收集器。但它有一个最大特点是:尽量达到一个可控制的吞吐量。

比如完成一个任务,用户代码加上垃圾收集共花费了100秒,其中垃圾收集花费1秒,那吞吐量就是99%。

4.Serial Old收集器

Serial Old收集器是Serial收集器的老年代版本,同样的单线程,区别在于基于“标记-整理算法”实现。

5.Parallel Old收集器

Parallel Old收集器是Parallel Scavenge收集器的老年代版本,支持多线程并发收集,基于“标记-整理算法”实现。

6.CMS收集器

CMS(Concurrent Mark Sweep)收集器是一款基于“标记-清除算法”实现的,以获取最短回收停顿时间(缩短STW时间)为目标的收集器,它的运作更加复杂,整个过程分为以下四步:

(1)初始标记:标记以下GC Roots能直接关联到的对象,速度很快,需要"STW"

(2)并发标记:从GC Roots的直接关联对象开始遍历整个对象图,速度比较慢,但是不需要"STW"

(3)重新标记:标记那些刚刚并发标记期间,可能被用户重新抛弃的对象,速度比初始标记稍长,需要"STW"

(4)并发清除:清理被标记的已死亡的对象,由于不需要移动存活对象,所以可以并发执行,不需要"STW"

由于初始标记和重新标记的时间很短,因此CMS收集器可以理解为是内存回收的过程和用户线程一起并发执行的。

7.Garbage First收集器

Garbage First(简称G1)收集器是一款具有“停顿时间模型”的收集器,而实现这一模型的关键是基于Region的堆内存布局。这款收集器就像T1(faker)一样,很强,是当前介绍的几款里最强的

停顿时间模型的意思是能够支持指定在一个长度为M毫秒的时间内,消耗在垃圾收集上的时间大概率不超过N毫秒这样的目标。我们可以理解为:终于可以设置我想要的垃圾回收时间啦。

Region:将连续的Java堆划分为多个大小相等的独立区域,每一个区域都就是一个Region。它的不凡之处在于,每一个Region都可以根据需要扮演不同的角色:可以是Eden空间,可以是Survivor空间,也可以是老年代空间。值得一提的是Region中还有一类特殊的Humongous区域,专门用来存储大对象(占一个Region大小容量一半的对象),而G1收集器一般把该区域的对象当做老年代来处理。

在这里插入图片描述

G1收集器的运作过程分为以下四步:

1.初始标记:标记一下GC Roots能直接关联到的对象,需要短暂停顿,耗时很短。

2.并发标记:从GC Root 开始对堆中对象进行可达性分析,找到要回收的对象,耗时较长,但是和用户线程并发执行,没有"STW"。当对象图扫描完成后,还要重新处理刚刚并发时有引用变动的对象。

3.最终标记:对用户线程做另外一个短暂的暂停,用于处理并发阶段结束后仍然遗留下来的最后那少量的SATB记录。

4.筛选回收:先更新Region的统计数据,对各个Region的回收价值和成本进行排序,根据用户指定的时间(停顿时间模型在此处展现)来选择要回收的多个Region,将这些Region中存活的对象复制到空的Region中,再清理掉整个旧的Region的全部空间。这里涉及移动存活的对象,所以需要暂停用户线程,由多条收集器线程并行完成。

可见G1收集器除了并发标记以外,其他阶段都需要暂停用户线程,它并不是纯粹地追求低延迟,而是在延迟可控的情况下获得尽可能高的吞吐量,所以才担得起“全功能收集器”的重任和期望。


http://chatgpt.dhexx.cn/article/lDsKC5ia.shtml

相关文章

GC 垃圾收集器

GC 垃圾回收算法 和 垃圾收集器之间的关系是什么呢 ? GC算法 (复制 / 标清 / 标整 ) 是内存回收的一种思想 , 垃圾收集器就是 GC算法 的落地实现我们知道没有最完美的 GC算法 , 因此目前为止也没有完美的垃圾收集器 , 只是针对不同的情况选择最适合的收集器来进行分代收集 主要…

7种垃圾收集器

如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。 Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商、版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根据…

垃圾收集器简介

HotSpot JVM收集器 上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器。如果两个收集器之间存在连线,就说明它们可以搭配使用。 Serial(串行GC)收集器 Serial收集器是一个新生代收集器,单线程执行&…

【JVM】7种经典的垃圾收集器

文章目录 1. 垃圾收集器概述2. Serial 收集器3. ParNew 收集器4. Paraller Scavenge 收集器5. Serial Old收集器6. Parller Old收集器7. CMS 收集器8. Garbage First 收集器 本文参考:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版&#x…

JVM垃圾收集器

一.概述 GC需要完成的三件事:1.哪些内存需要回收? 2.什么时候回收? 3.如何回收 Java内存运行时区域的各个部分: a. 其中程序计数器、虚拟机栈、本地方法栈三个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行…

垃圾收集算法与垃圾收集器

典型的垃圾收集算法 1.Mark-Sweep(标记-清除)算法 这是最基础的垃圾回收算法,之所以说它是最基础的是因为它最容易实现,思想也是最简单的。标记-清除算法分为两个阶段:标记阶段和清除阶段。标记阶段的任务是标记出所有…

Java 的七种垃圾收集器

用 C 或 C 这样的编程语言写一个应用时,需要编写代码来销毁内存中不再需要的对象。当应用程序扩展得越来越复杂时,未使用对象被忽略释放的可能性就越大。这会导致内存泄露,最终内存耗尽,在某个时刻将没有更多的内存可以分配。结果…

Java 垃圾收集器

堆内存示意图 垃圾收集算法 1.标记-清除算法 算法分为标记和清除两个阶段。标记出所有需要回收的对象,在标记完成后,统一回收。 缺点: 执行效率不稳定,若堆中有大量对象要被回收,这是必须进行大量标记和清除动作&a…

JVM 垃圾收集器

title: “JVM 垃圾收集器” date: 2022-03-11T16:45:2108:00 draft: false 文章目录 引言术语垃圾收集器介绍Serial 收集器(新生代)ParNew收集器(新生代)Parallel Scavenge收集器(新生代)Serial Old 收集器…

详解ZGC垃圾收集器

从G1垃圾收集器开始,后面的垃圾收集器都不再将堆按照新生代和老年代作为整体进行回收,都采用了局部收集的设计思想。 可能是由于G1作为第一代局部收集的垃圾收集器,所以它继续保留了新生代和老年代的概念,笔者认为从局部收集和分…

JVM——垃圾收集器

目录 引言 垃圾收集器 如何判断对象已死? 引用计数算法: 可达性分析算法: 垃圾收集算法 标记-清除算法 标记-复制算法 标记-整理算法 并发的可达性分析 经典垃圾收集器 内存分配与回收策略 1.对象优先在Eden分配 …

jvm垃圾收集器有哪些

Serial收集器 Serial收集器是最基本,发展最悠久的收集器,在JDK1.3.1之前是虚拟机新生代垃圾回收的唯一选择。这个收集器是一个单线程的。它的单线程的意义并不仅仅说明它只会使用一个CPU或者一条收集线程去完成收集工作,最重要的是&#xff…

经典垃圾收集器(三)

低延迟垃圾收集器 衡量垃圾收集器的三项重要指标:内存占用(Footprint)、吞吐量(Throughput)和延迟(Latency)。三者构成了一个“不可能三角” Shenandoah收集器 Shenandoah相比于G1有什么改进&…

垃圾收集器

如果说垃圾回收算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现,java虚拟机实现规范中对垃圾收集器应该如何实现并没有任何规定,因此不同厂商、不同版本的虚拟机提供的垃圾收集器存在很大的差异,接下来我们主要介绍…

深入理解7种垃圾收集器

**如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。**Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商、版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用户根…

Java中的垃圾收集器

目录 1、Java的垃圾收集器的分类 2、收集器的特点 3、评估GC的性能指标 4、Serial收集器 5、ParNew收集器 6、Parallel Scavenge 吞吐量优先 (与Parallel Old搭配) 7、CMS收集器 8、G1收集器 9、各种收集器的应用场景 垃圾收集器:垃…

java垃圾收集器

目录 简介 Serial 收集器 ParNew 收集器 并行(Parallel) 并发(Concurrent) Parallel Scavenge 收集器 Serial Old 收集器 Parallel Old 收集器 CMS收集器 G1收集器 G1简介 G1细节 G1 Minor GC流程 G1 Mixed GC流程 …

常用垃圾收集器介绍

本节将会介绍一下HotSpot虚拟机中的常用垃圾收集器:Serial,ParNew,Parallel Scavenge,Serial Old,Parallel Old,CMS,G1,会对每个垃圾收集器的概念和常用参数做下介绍。 目录 概述 …

JVM-垃圾收集器

一、常见的垃圾收集器有串行垃圾回收器(Serial)、并行垃圾回收器(Parallel)、并发清除回收器(CMS)、G1回收器。 1、串行垃圾回收器。 为单线程环境设计且只使用一个线程进行垃圾回收,会暂停所…

JVM:7种垃圾收集器

一、Serial收集器(单线程收集器) 这个收集器是一个单线程的收集器,但它的“单线程”的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程…