Java 的七种垃圾收集器

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

用 C 或 C++ 这样的编程语言写一个应用时,需要编写代码来销毁内存中不再需要的对象。当应用程序扩展得越来越复杂时,未使用对象被忽略释放的可能性就越大。这会导致内存泄露,最终内存耗尽,在某个时刻将没有更多的内存可以分配。结果就是应用程序运行失败并出现 OutOfMemoryError 错误。但在 Java 中, 垃圾收集器Garbage Collection (GC)会在程序执行过程中自动运行,减轻了手动分配内存和可能的内存泄漏的任务。

垃圾收集器并不只有一种,Java 虚拟机(JVM)有七种不同的垃圾收集器,了解每种垃圾收集器的目的和优点是很有用的。

1、Serial 收集器

垃圾收集器的原始实现,使用单线程。当垃圾收集器运行时,会停止应用程序(通常称为“stop the world”事件)。适用于能够承受短暂停顿的应用程序。该垃圾收集器占用内存空间比较小,因此这是嵌入式应用程序的首选垃圾收集器类型。在运行时使用以下命令启用该垃圾收集器:

$ java -XX:+UseSerialGC

2、Parallel 收集器

像 Serial 收集器一样,Parallel 收集器也使用“stop the world”方法。这意味着,当垃圾收集器运行时,应用程序线程会停止。但是不同的是,Parallel 收集器运行时有多个线程执行垃圾收集操作。这种类型的垃圾收集器适用于在多线程和多处理器环境中运行中到大型数据集的应用程序。

这是 JVM 中的默认垃圾收集器,也被称为 吞吐量收集器 。使用该垃圾收集器时可以通过使用各种合适的 JVM 参数进行调优,例如吞吐量、暂停时间、线程数和内存占用。如下:

-XX:ParallelGCThreads=<N>
-XX:MaxGCPauseMillis=<N>
-XX:GCTimeRatio=<N>
-Xmx<N>

Parallel 收集器可以使用该命令显式启用: java -XX:+UseParallelGC 。使用这个命令,指定在新生代中通过多个线程进行垃圾回收,而老年代中的垃圾收集和内存压缩仍使用单个线程完成的。

还有一个版本的的 Parallel 收集器叫做 “Parallel Old GC”,它对新生代和老年代都使用多线程,启用命令如下:

$ java -XX:+UseParallelOldGC

3、Concurrent Mark Sweep(CMS)收集器

Concurrent Mark Sweep(CMS)垃圾收集器与应用程序并行运行。对于新生代和老年代都使用了多线程。在 CMS 垃圾收集器删除无用对象后,不会对存活对象进行内存压缩。该垃圾收集器和应用程序并行运行,会降低应用程序的响应时间,适用于停顿时间较短的应用程序。这个收集器在 Java8 已过时,并在 Java14 中被移除。如果你仍在使用有这个垃圾收集器的 Java 版本,可以使用如下命令启用:

$ java -XX:+UseConcMarkSweepGC

在 CMS 垃圾收集器使用过程中,应用程序将暂停两次。首次暂停发生在标记可直接访问的存活对象时,这个暂停被称为 初始标记 。第二次暂停发生在 CMS 收集器结束时期,来修正在并发标记过程中,应用程序线程在 CMS 垃圾回收完成后更新对象时被遗漏的对象。这就是所谓的 重新标记 。

4、G1 收集器

G1 垃圾收集器旨在替代 GMS。G1 垃圾收集器具备并行、并发以及增量压缩,且暂停时间较短。与 CMS 收集器使用的内存布局不同,G1 收集器将堆内存划分为大小相同的区域,通过多个线程触发全局标记阶段。标记阶段完成后,G1 知道哪个区域可能大部分是空的,并首选该区域作为清除/删除阶段。

在 G1 收集器中,一个对象如果大小超过半个区域容量会被认为是一个“大对象” 。这些对象被放置在老年代中,在一个被称为“humongous region”的区域中。 启用 G1 收集器的命令如下:

$ java -XX:+UseG1GC

5、Epsilon 收集器

该垃圾收集器是在 Java11 中引入的,是一个 no-op (无操作)收集器。它不做任何实际的内存回收,只负责管理内存分配。Epsilon 只在当你知道应用程序的确切内存占用情况并且不需要垃圾回收时使用。启用命令如下:

$ java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC

6、Shenandoah 收集器

Shenandoah 是在 JDK12 中引入的,是一种 CPU 密集型垃圾收集器。它会进行内存压缩,立即删除无用对象并释放操作系统的空间。所有的这一切与应用程序线程并行发生。启用命令如下:

$ java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC

7、ZGC 收集器

ZGC 为低延迟需要和大量堆空间使用而设计,允许当垃圾回收器运行时 Java 应用程序继续运行。ZGC 收集器在 JDK11 引入,在 JDK12 改进。在 JDK15,ZGC 和 Shenandoah 都被移出了实验阶段。启用 ZGC 收集器使用如下命令:

$ java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC

灵活的垃圾收集器

Java 为我们提供了灵活的内存管理方式,熟悉不同的可用方法有助于为正在开发或运行的应用程序选择最合适的内存管理方式。


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

相关文章

Java 垃圾收集器

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

JVM 垃圾收集器

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

详解ZGC垃圾收集器

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

JVM——垃圾收集器

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

jvm垃圾收集器有哪些

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

经典垃圾收集器(三)

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

垃圾收集器

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

深入理解7种垃圾收集器

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

Java中的垃圾收集器

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

java垃圾收集器

目录 简介 Serial 收集器 ParNew 收集器 并行&#xff08;Parallel&#xff09; 并发&#xff08;Concurrent&#xff09; Parallel Scavenge 收集器 Serial Old 收集器 Parallel Old 收集器 CMS收集器 G1收集器 G1简介 G1细节 G1 Minor GC流程 G1 Mixed GC流程 …

常用垃圾收集器介绍

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

JVM-垃圾收集器

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

JVM:7种垃圾收集器

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

JVM学习----七种垃圾收集器(GC)

文章目录 GC垃圾收集器七种经典的垃圾回收器查看默认垃圾收集器新生代Serial垃圾收集器&#xff08;单线程、 复制算法&#xff09;ParNew 垃圾收集器 &#xff08;Serial的多线程版本、 复制算法&#xff09;Parallel Scavenge 收集器&#xff08;多线程复制算法、高效&#x…

ADS2020仿真信号的反射实例

通过前面对高速信号反射的学习&#xff0c;我们已经从理论上搞清了信号的反射&#xff0c;下面就借助高速信号仿真工具来看一下信号的反射。下图为典型的型号反弹图仿真电路。 R1为信号源内阻&#xff0c;TLIN为理想传输线模型&#xff0c;V1为近端测试点&#xff0c;V2为远端…

ADS(Advanced Design system)仿真测试元器件在不同功率下的输入阻抗

前言 先进设计系统 Advanced Design system&#xff08;ADS&#xff09;Agilent Technologies 是领先的电子设计自动化软件&#xff0c;适用于射频、微波和信号完整性应用。在前面的文章中&#xff0c;我详细介绍了如何测量电路的输入阻抗&#xff0c;但是测量方法是基于无源输…

ADS实验报告三:匹配电路的设计与仿真

文章目录 一、实验名称&#xff1a;匹配电路的设计与仿真二、实验要求&#xff1a;三、实验内容&#xff1a;1. 分立电容电感元件匹配电路仿真1.1 设计步骤及原理图1.2 仿真结果 2. 微带单分支短截线匹配电路仿真2.1 设计步骤及原理图2.2 仿真结果 3. 微带双分支短截线匹配电路…

ADS仿真遇到error如何查找原因

今天使用ADS进行版图仿真时&#xff0c;一直出现这样的error 每次遇到error出现&#xff0c;我选择的解决办法是&#xff1a; 1、看error英文&#xff0c;尝试自己理解&#xff1b; 2、使用有道&#xff08;或者google翻译&#xff09;的拍照翻译功能&#xff0c;看翻译是否与…

ICCAP2016如何调用ads的仿真器hpeesofsim

问题描述&#xff1a; 在安装了iccap2016和ads2016之后&#xff0c;发现iccap2016可以使用spice2仿真器&#xff0c;但是用hpeesofsim仿真器就会报错&#xff0c;显示找不到"\bin\iccapinterface"。 问题解决&#xff1a; 经过查询iccap的手册后发现&#xff0c;icc…

ADS(Advanced Design system)仿真对电路进行阻抗匹配

前言 先进设计系统 Advanced Design system&#xff08;ADS&#xff09;Agilent Technologies 是领先的电子设计自动化软件&#xff0c;适用于射频、微波和信号完整性应用。在测得到测试电路的输入阻抗后&#xff0c;那就是要对源阻抗和负载阻抗&#xff08;测试得到的输入阻抗…