JVM-垃圾收集器

article/2025/11/5 6:48:25

一、常见的垃圾收集器有串行垃圾回收器(Serial)、并行垃圾回收器(Parallel)、并发清除回收器(CMS)、G1回收器。

1、串行垃圾回收器。

为单线程环境设计且只使用一个线程进行垃圾回收,会暂停所有的用户线程,所以不适合服务器环境。

堆内存中新生代垃圾回收器(Serial):

串行收集器是最古老,最稳定以及效率高的收集器,只使用一个线程去回收,但其在进项垃圾收集过程中可能会产生较长的停顿(Stop-The-World)状态。虽然在收集垃圾的过程找那个需要暂停所有其他的工作线程,但是它简单高效,对于限定单个CPU环境来说,没有线程交互的开销,可以获得最高的单线程垃圾收集效率,因此Serial垃圾收集器依然是java虚拟机运行在Client模式下默认的新生代垃圾收集器。

堆内存中老年代垃圾回收器(Serial Old):

Serial old是Serial垃圾收集器老年代版本,它同样是单线程的收集器,使用标记-整理算法,这个收集器也主要是运行在Client默认的老年代垃圾收集器,在老年代中,也充当CMS收集器的后备垃圾收集方案。(GC单线程

2、并行垃圾回收器

多个垃圾回收器并行工作,此时用户线程是暂时的,适用于科学计算/大数据处理等弱交互场景。

堆内存中新生代垃圾回收器(ParNew、Parallel Scavenge):

ParNew收集器其实就是Serial收集器新生代的并行多线程版本,最常见的应用场景是配合老年代CMS GC工作,其余的行为和Serial收集器完全一样,ParNew垃圾收集器在垃圾收集过程中同样也要暂停所有其他的工作线程。GC多线程

JVM配置:-XX:+UseParNewGC 使用ParNew收集器

Parallel Scavenge收集器类似ParNew也是一个新生代垃圾收集器,使用复制算法,也是一个并行的多线程的垃圾收集器,俗称吞吐量优先收集器。(GC多线程

JVM配置:-XX:+UseParallelGC 使用Parallel Scavenge收集器

 堆内存中老年代垃圾回收器(Parallel Old):

Parallel Old收集器是Parallel Scavenge的老年代版本,使用多线程的标记-整理算法,Parallel Old收集器在JDK1.6才开始提供。

在JDK1.6之前,新生代使用Parallel Scavenge收集器只能搭配老年代的Serial Old收集器,只能保证新生代的吞吐量优先,无法保证整体吞吐量。

JDK1.8后考虑新生代Parallel Scavenge和老年代Parallel Old收集器的搭配策略。

JVM配置:-XX:+UseParallelOldGC 使用Parallel Old收集器

3、并发清除回收器

CMS(Concurrent Mark Sweep:并发标记清除) 是一种以获取最短回收停顿时间为目标的收集器。

CMS非常适合堆内存大、CPU核数多的服务器端应用,也是G1出现之前大型应用的首选收集器。

用户线程和垃圾收集线程同时执行(不一定是并行,可能交替执行),不需要停顿用户线程,互联网公司多用它,适用对响应时间有要求的场景。 主要在老年代回收。

初始标记(Initial Mark):只是标记一下GC Roots能关联的对象,速度很快,仍然需要暂停所有工作线程。

并发标记(Concurrent Mark):进项GC Roots跟踪过程,和用户线程一起执行,不需要暂停工作线程,主要标记过程、标记全部对象。

重新标记(Remark):为了修正在并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,仍然需要暂停所有用户线程。

并发清除(Concurrent Sweep):清除GC Roots不可达对象,和用户线程一起工作,不需要暂停工作线程,基于标记结果,直接清除对象。

CMS优点:并发收集停顿低。缺点:并发执行对CPU资源消耗大,标记清除算法会产生碎片。

JVM配置:-XX:+UseConcMarkSweepGC 使用CMS收集器

4、G1垃圾回收器

G1(Garbage-First)垃圾回收器将堆内存分割成不同的区域,然后并发的对其进行垃圾回收。G1收集器的设计目标是取代CMS收集器,它同CMS相比,不会产生大量内存碎片,并可以添加预测机制,用户可以指定期望停顿时间(可通过配置-XX:MaxGCPauseMills=n最大停顿时间)。

特点:

  • G1能充分利用多CPU、多核环境硬件优势,尽量缩短STW。
  • G1整体采用标记-整理算法,局部通过复制算法,不会产生大量内存碎片。
  • 宏观上看G1之中不再区分年轻代和老年代。把内存划分成多个独立的子区域,可以近似理解为一个围棋的棋盘。
  • G1收集器里面将整个内存区都混合在一起了,但其本身依然在小范围内要进行年轻代和老年代的区分,保留了新生代和老年代,但他们不再是物理隔离了,而是一部分Region的集合且不需要Region是连续的,也就是说依然会采用不同的GC方式来处理不同的区域。
  • G1虽然也是分代收集器,但整个内存分区不存在物理上的年轻代和老年代的区别,也不需要完全独立的Survivor堆做复制准备,G1只有逻辑上的分代概念,或者说每个分区都可以随G1的运作在不同代之间前后切换。

区域化内存划分Region,整体变为一系列不连续的内存区域,避免了全内存区的GC操作。核心思想是将整个堆内存区域分成大小相同的子区域(Region),在JVM启动时会自动设置这些子区域的大小,在堆的使用上,G1并不要求对象的存储一定在物理上连续的,只要逻辑上连续即可,每个分区也不会固定的为某个代服务,可以按需在年轻代和老年代之间切换。启动时可以通过参数配置-XX:G1HeapRegionSize=n可指定分区大小(1MB~32MB,且必须是2的幂),默认将整堆划分为2048个分区。

大小范围在1MB~32MB,最多能设置2048个大小相同的子区域,也即能够支持的最大内存为:32MB*2048 = 65536MB ≈ 64G内存

收集演示:

这些Region的一部分包含新生代,新生代的垃圾收集依然采用暂停所有应用线程的方式,将存活的对象拷贝到老年代或者Survivor空间。

这些Region的一部分包含老年代,G1收集器通过将对象从一个区域复制到另一个区域,完成了清理工作。这就意味着,在正常的处理过程中,G1完成了堆的压缩(至少是部分堆的压缩),这样就不会有CMS的内存碎片问题了。

 

G1收集器运行过程 

  • 初始标记:只是标记GC Roots能直接关联的对象
  • 并发标记:进项GC Roots跟踪的过程
  • 最终标记:修正并发标记期间,因程序运行而导致标记发生变化的那一部分对象
  • 筛选回收:根据时间来进项价值最大化的回收

 JVM配置:-XX:+UseG1GC 使用G1收集器

 二、如何选择垃圾回收器

组合选择:

  • 单CPU或小内存,单机程序

        -XX:+UseSerialGC

  • 多CPU,需要最大吞吐量,如后台计算型应用

        -XX:+UseParallelGC或者

        -XX:+UseParallelOldGC

  • 多CPU,追求低停顿时间,需快速响应如互联网应用

        -XX:+UseConcMarkSweepGC

        -XX:+ParNewGC

 


http://chatgpt.dhexx.cn/article/5LXl04Pn.shtml

相关文章

JVM:7种垃圾收集器

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

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

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

ADS2020仿真信号的反射实例

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

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

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

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

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

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

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

ICCAP2016如何调用ads的仿真器hpeesofsim

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

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

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

ADS仿真 之 直流仿真示例

本文介绍采用ADS2009仿真软件进行直流仿真,其用于测试设计电路的直流工作特性,它是所有模拟仿真、射频仿真的基础,是整个仿真的起点。对电路的直流仿真可以验证电路设计的DC特性、确定电路功耗、模拟DC传输特性(I-V曲线&#xff0…

ADS版图仿真遇到的问题

1,在仿真进行时,没有关程序,直接重启电脑出现的。 Error: Cannot start the simulation because the presence of the lock directory "E:\code\ADScode\TP_BPF_HFSS\Tp_8p8m\MyWorkspace_wrk\simulation\MyLibrary_lib\tp…

allegro16.6导出版图到ADS2019仿真的方法

首先配置好allegro软件 1. 选择FILE->Script, 弹出窗口后选择Browse , 选择ADS对应文件夹下\Keysight\ADS2019\ial\scripts的描述文件,并勾选Change Directory 点击确认; 2.回到Scripting界面点击Replay ; 在弹出的窗口红框位…

ADS仿真加载线型移相器

ADS仿真移相器 文章目录 ADS仿真移相器1、移相器的简介2、改进的负载型移相器仿真实例1.新建一个工程2.建立原理图3.仿真、查看结果采用并联电容的形式采用并联电感的形式总结规律1、移相器的简介 移相器是应用于微波通信、雷达和测量系统中的一种控制设备。它是一种二端口网络…

ADS(Advanced Design system)仿真后绘图和绘图技巧

前言 先进设计系统 Advanced Design system(ADS)Agilent Technologies 是领先的电子设计自动化软件,适用于射频、微波和信号完整性应用。 本文将记录,在使用ADS仿真后,根据数据作图,同时会记录一些绘图技…

主流仿真软件介绍

主流PCB仿真软件介绍(Sigrity、ADS、Hyperlynx、SIwave、HFSS) SigrityHyperlynxADSSIwaveHFSS总结文章来源于微信公众号,欢迎关注:PCB设计与信号完整性仿真 每隔18-24个月集成电路上可以容纳的元器件数量便会增加一倍&#xff0c…

ADS学习:LC滤波器设计与仿真

1.新建工程&新建原理图 2.绘制原理图,各参数如图所示 3.单击元器件可设置属性以及要显示的选项 4.仿真相关设置入口 5.启动仿真,会自动弹出状态窗口 6.仿真结束自动生成数据窗口 7. 创建直角坐标查看S(1,1)、S(2,1) 8. Smith圆图 9.数据表&#xff0…

功率放大器ADS仿真实例

一、理论基础 根据工作状态的不同,功率放大器可分为线性功率放大器和开关型功率放大器,线性功率放大器包含:A、B、C、AB类放大器,开关型功率放大器包含:D、E、F类放大器。为获得较好的线性度和高增益,因此…

ADS实验报告二:滤波器的仿真设计

文章目录 一、实验名称:滤波器的仿真设计二、实验要求:三、实验内容:1. 分立元件LC低通滤波器1.1 设计步骤及原理图1.2 仿真结果2. 用滤波器设计向导设计滤波器2.1 设计步骤及原理图2.1.1 低通2.1.2 高通2.1.3 带通2.2 仿真结果2.2.1 低通2.2.2 高通2.2.3 带通3. 微带线低通…

仿真软件ADS2015安装破解教程

下载链接:http://pan.baidu.com/s/1eSpKRPw 1.2G的是安装程序,28M的是破解软件, 下载好了运行安装, 需要注意3个地方 1.安装路径不能有中文目录,如果是默认路径最好截图,方便待会去改东西 2.选择在桌面创…

射频放大电路的优化及ADS仿真

1 引 言  在无线通信飞速发展的今天,射频设计具有举足轻重的作用,而放大电路是几乎所有无线通信系统的必备环节。由于工作频率的日益提高,模拟和数字电路设计工程师们正在不断地开发和改进电路,用于无线通信的模拟电路是在GHz波…

ADS板级PCIE_SI仿真

ADS板级PCIE_SI仿真 文件准备 ODB格式文件 建立好workspace后,主界面选择File→Import→Design 点击OK导入完成 叠层及材料设置:选择默认值即可 启动SIPro,在弹出的窗口选择Yes/Ok即可 设置仿真分析类型,SIPro/PIPro包含…