垃圾收集器简介

article/2025/11/5 3:47:43

HotSpot JVM收集器

              上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器。如果两个收集器之间存在连线,就说明它们可以搭配使用。

Serial(串行GC)收集器

Serial收集器是一个新生代收集器,单线程执行,使用复制算法。它在进行垃圾收集时,必须暂停其他所有的工作线程(用户线程)。是Jvm client模式下默认的新生代收集器。对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。

ParNew(并行GC)收集器

ParNew收集器其实就是serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为与Serial收集器一样。

Parallel Scavenge(并行回收GC)收集器

Parallel Scavenge收集器也是一个新生代收集器,它也是使用复制算法的收集器,又是并行多线程收集器。parallel Scavenge收集器的特点是它的关注点与其他收集器不同,CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而parallel Scavenge收集器的目标则是达到一个可控制的吞吐量。吞吐量= 程序运行时间/(程序运行时间 + 垃圾收集时间),虚拟机总共运行了100分钟。其中垃圾收集花掉1分钟,那吞吐量就是99%。

Serial Old(串行GC)收集器

Serial Old是Serial收集器的老年代版本,它同样使用一个单线程执行收集,使用“标记-整理”算法。主要使用在Client模式下的虚拟机。

Parallel Old(并行GC)收集器

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。

CMS(并发GC)收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。CMS收集器是基于“标记-清除”算法实现的,整个收集过程大致分为4个步骤:
①.初始标记(CMS initial mark)
②.并发标记(CMS concurrenr mark)
③.重新标记(CMS remark)
④.并发清除(CMS concurrent sweep)
其中初始标记、重新标记这两个步骤任然需要停顿其他用户线程。初始标记仅仅只是标记出GC ROOTS能直接关联到的对象,速度很快,并发标记阶段是进行GC ROOTS 根搜索算法阶段,会判定对象是否存活。而重新标记阶段则是为了修正并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间会被初始标记阶段稍长,但比并发标记阶段要短。
由于整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,所以整体来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。
CMS收集器的优点:并发收集、低停顿,但是CMS还远远达不到完美,器主要有三个显著缺点:
CMS收集器对CPU资源非常敏感。在并发阶段,虽然不会导致用户线程停顿,但是会占用CPU资源而导致引用程序变慢,总吞吐量下降。CMS默认启动的回收线程数是:(CPU数量+3) / 4。
CMS收集器无法处理浮动垃圾,可能出现“Concurrent Mode Failure“,失败后而导致另一次Full  GC的产生。由于CMS并发清理阶段用户线程还在运行,伴随程序的运行自热会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS无法在本次收集中处理它们,只好留待下一次GC时将其清理掉。这一部分垃圾称为“浮动垃圾”。也是由于在垃圾收集阶段用户线程还需要运行,
即需要预留足够的内存空间给用户线程使用,因此CMS收集器不能像其他收集器那样等到老年代几乎完全被填满了再进行收集,需要预留一部分内存空间提供并发收集时的程序运作使用。在默认设置下,CMS收集器在老年代使用了68%的空间时就会被激活,也可以通过参数-XX:CMSInitiatingOccupancyFraction的值来提供触发百分比,以降低内存回收次数提高性能。要是CMS运行期间预留的内存无法满足程序其他线程需要,就会出现“Concurrent Mode Failure”失败,这时候虚拟机将启动后备预案:临时启用Serial Old收集器来重新进行老年代的垃圾收集,这样停顿时间就很长了。所以说参数-XX:CMSInitiatingOccupancyFraction设置的过高将会很容易导致“Concurrent Mode Failure”失败,性能反而降低。
最后一个缺点,CMS是基于“标记-清除”算法实现的收集器,使用“标记-清除”算法收集后,会产生大量碎片。空间碎片太多时,将会给对象分配带来很多麻烦,比如说大对象,内存空间找不到连续的空间来分配不得不提前触发一次Full  GC。为了解决这个问题,CMS收集器提供了一个-XX:UseCMSCompactAtFullCollection开关参数,用于在Full  GC之后增加一个碎片整理过程,还可通过-XX:CMSFullGCBeforeCompaction参数设置执行多少次不压缩的Full  GC之后,跟着来一次碎片整理过程。

G1收集器

G1(Garbage First)收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。还有一个特点之前的收集器进行收集的范围都是整个新生代或老年代,而G1将整个Java堆(包括新生代,老年代)。

垃圾收集器参数总结

-XX:+<option> 启用选项
-XX:-<option> 不启用选项
-XX:<option>=<number> 
-XX:<option>=<string>

参数描述

-XX:+UseSerialGC

Jvm运行在Client模式下的默认值,打开此开关后,使用Serial + Serial Old的收集器组合进行内存回收
-XX:+UseParNewGC打开此开关后,使用ParNew + Serial Old的收集器进行垃圾回收
-XX:+UseConcMarkSweepGC使用ParNew + CMS +  Serial Old的收集器组合进行内存回收,Serial Old作为CMS出现“Concurrent Mode Failure”失败后的后备收集器使用。
-XX:+UseParallelGCJvm运行在Server模式下的默认值,打开此开关后,使用Parallel Scavenge +  Serial Old的收集器组合进行回收
-XX:+UseParallelOldGC使用Parallel Scavenge +  Parallel Old的收集器组合进行回收
-XX:SurvivorRatio新生代中Eden区域与Survivor区域的容量比值,默认为8,代表Eden:Subrvivor = 8:1
-XX:PretenureSizeThreshold直接晋升到老年代对象的大小,设置这个参数后,大于这个参数的对象将直接在老年代分配
-XX:MaxTenuringThreshold晋升到老年代的对象年龄,每次Minor GC之后,年龄就加1,当超过这个参数的值时进入老年代
-XX:UseAdaptiveSizePolicy动态调整java堆中各个区域的大小以及进入老年代的年龄
-XX:+HandlePromotionFailure是否允许新生代收集担保,进行一次minor gc后, 另一块Survivor空间不足时,将直接会在老年代中保留
-XX:ParallelGCThreads设置并行GC进行内存回收的线程数
-XX:GCTimeRatioGC时间占总时间的比列,默认值为99,即允许1%的GC时间,仅在使用Parallel Scavenge 收集器时有效
-XX:MaxGCPauseMillis设置GC的最大停顿时间,在Parallel Scavenge 收集器下有效
-XX:CMSInitiatingOccupancyFraction设置CMS收集器在老年代空间被使用多少后出发垃圾收集,默认值为68%,仅在CMS收集器时有效,-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSCompactAtFullCollection
由于CMS收集器会产生碎片,此参数设置在垃圾收集器后是否需要一次内存碎片整理过程,仅在CMS收集器时有效
-XX:+CMSFullGCBeforeCompaction
设置CMS收集器在进行若干次垃圾收集后再进行一次内存碎片整理过程,通常与UseCMSCompactAtFullCollection参数一起使用
-XX:+UseFastAccessorMethods
原始类型优化
-XX:+DisableExplicitGC
是否关闭手动System.gc
-XX:+CMSParallelRemarkEnabled
降低标记停顿
-XX:LargePageSizeInBytes
内存页的大小不可设置过大,会影响Perm的大小,-XX:LargePageSizeInBytes=128m

Client、Server模式默认GC

 新生代GC方式老年代和持久GC方式

Client

Serial 串行GCSerial Old 串行GC
ServerParallel Scavenge  并行回收GCParallel Old 并行GC

Sun/oracle JDK GC组合方式

 新生代GC方式老年代和持久GC方式

-XX:+UseSerialGC

Serial 串行GCSerial Old 串行GC
-XX:+UseParallelGCParallel Scavenge  并行回收GCSerial Old  并行GC
-XX:+UseConcMarkSweepGCParNew 并行GCCMS 并发GC 
当出现“Concurrent Mode Failure”时
采用Serial Old 串行GC
-XX:+UseParNewGCParNew 并行GCSerial Old 串行GC
-XX:+UseParallelOldGCParallel Scavenge  并行回收GCParallel Old 并行GC
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
Serial 串行GCCMS 并发GC 
当出现“Concurrent Mode Failure”时
采用Serial Old 串行GC


http://chatgpt.dhexx.cn/article/3y077x0j.shtml

相关文章

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

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

JVM垃圾收集器

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

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

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

Java 的七种垃圾收集器

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

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;但是测量方法是基于无源输…