常见垃圾回收器

article/2025/7/1 21:17:22

CMS和G1是最重要的

新生代一般采用标记复制,老年代一般采用标记整理算法

Serial:垃圾回收线程只有一个,而且垃圾回收线程工作的时候其他用户线程要停下来

 Parnew:Serial的多线程版本,有多个垃圾回收线程,垃圾回收线程工作的时候,其他用户线程要停下来

Parrel:多个垃圾回收线程,垃圾线程工作的时候其他用户线程需要停止工作,跟Parnew很像。可以设置参数:垃圾收集导致地最大停顿时间和设置吞吐量的大小。通过GC自适应调节策略(虚拟机会根据系统的运行状况动态地设置参数)来达到目标停顿时间和吞吐量。特点是获取最大吞吐量(一共运行100分钟,垃圾回收器花掉3分钟,吞吐量就是97%)

 CMS:第一款实现垃圾收集线程和用户线程同时工作的垃圾回收器,第一款并发收集器,目的是追求最短停顿时间(垃圾回收线程工作导致用户线程停顿的时间

 CMS垃圾回收器工作的的四个阶段:在初始标记和重新标记阶段只能有垃圾回收线程在工作,用户线程需要停止,其他两个阶段垃圾回收线程和用户线程可以同时工作

(1)初始标记:标记和GC Root直接相连的对象,这个阶段很快,但是这个阶段其他用户线程无法工作,还是会发生stop the world(STW)

(2)并发标记:CMS线程会从与GC Roots直接相连的对象出发,遍历所有对象,标记所有存活的对象,这个阶段,CMS线程和其他用户线程在并发执行

(3)重新标记:并发标记阶段由于CMS线程和其他用户线程并行运行,所以其他用户线程可能产生一些新的对象,这些新对象还没有打上是否存活的标记,所以需要标记出这些新对象中存活的对象,这个过程是只有CMS线程,用户线程需要停止工作,所以这个过程会引起STW

(4)并发清除:清除那些没有标记存活的对象,然后最后将这些对象的标记取消

助记:三个标记阶段,一个清除阶段

缺点:这种标记清除的回收方式会产生内存碎片

虽然STW时间很短,但是没法预测,G1就建立了一个预测模型

G1:STW时间可预测,可设置

整个Java堆划分成约2048个大小相同的Region块,继续保留新生代和老年代的概念但是并不是一块连续的内存是新生代,另一块连续的内存是老年代,而是一些不连续的Region组成新生代,另一些不连续的Region组成老年代

G1会跟踪各个Region里存活对象的数量,回收该区域所需要的时间经验值,在后台维护一个优先队列,每次根据允许的收集时间优先回收垃圾对象数量Region(也就是价值最大的垃圾)

总结:

CMS:追求最短的停顿时间,并行的,垃圾回收线程可以和用户线程同时执行(只有初始标记阶段需要暂停用户线程,其他阶段不需要暂停用户线程)     采用三色标记法

G1:HotSpot 开发团队赋予它的使命是未来可以替换掉 CMS 收集器

Serial 单个垃圾回收线程执行(单线程),其他所有用户线程都要停下来

Serial是用于新生代的垃圾回收器,它的老年代版本是Serial old

Parnew多个垃圾回收线程执行(多线程),其他所有用户线程都要停下来

下面是 HotSpot 虚拟机中的 7 个垃圾收集器。上面是新生代的垃圾回收器,下面是老年代的垃圾回收器,G1既可以用于新生代的垃圾回收,也可以用于老年代的垃圾回收,连线表示垃圾收集器可以配合使用

首先要理解以下两个概念:

(1)单线程和多线程:  垃圾收集器只使用一个线程就说垃圾收集器是单线程的,垃圾收集器使用多个线程就说垃圾收集器是多线程

(2)串行和并行:

串行指的是垃圾收集器和用户程序交替执行(执行垃圾收集器的时候需要停止用户程序,即用户现线程和GC线程交替执行),

并行是指垃圾收集器和用户程序同时执行(也就是执行垃圾收集器的时候不需要停止用户程序,即用户线程和GC线程可以一起执行

1.Serial垃圾回收器

Serial(串行)收集器是最基本、历史最悠久的垃圾收集器了,是一个单线程收集器(也就是它只会使用一个垃圾收集线程去完成垃圾收集工作)              

它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( "Stop The World" ),直到它收集结束

 Serial垃圾回收器在回收垃圾的时候,新生代采用标记-复制算法,老年代采用标记-整理算法。

Serial 收集器由于没有线程交互的开销,自然可以获得很高的单线程收集效率

2.ParNew收集器

 Serial 收集器的多线程版本,也是新生代采用标记-复制算法,老年代采用标记-整理算法

 除了 Serial 收集器,只有它能与 CMS 收集器配合使用

 3.CMS垃圾回收器

追求最短的停顿时间(STW),分为四个阶段:初始标记,并发标记,重新标记,并发清理,只有初始标记阶段和重新标记阶段需要暂停用户线程,其他阶段不需要暂停用户线程,可以和用户线程并行),所以适用于暂停时间要求比较高的,比如实时系统,交互式系统

整个过程分为以下几个步骤:

 (1)初始标记:标记直接与 root 相连的对象 (不直接相连,间接相连的不标记),这是一个STW(stop the world)阶段,其他用户线程是不能工作的

(2)并发标记:CMS线程会从与GC Roots直接相连的对象出发,遍历整个对象图 ,标记所有存活的对象,这个阶段,CMS线程和其他用户线程在并发执行,

(3)重新标记: 由于上一个阶段并发标记阶段其他用户线程实际上还是在运行的,有可能用户线程在这个阶段产生了新的对象(这些新的对象中的存活对象是没有打上标记的),这里采用三色标记法来标记那些新产生的对象中存活对象  

(4)并发清理:清除所有没有被标记的对象,这个阶段如果有新增对象会被标记为黑色,不做任何处理       

最后并发重置就是把 标记过的对象取消标记

 三色标记算法:

黑色:这个对象及其所有的引用的对象都被遍历过,那这个对象就是黑色,黑色的对象不会被回收

灰色:这个对象被遍历过,但是它的部分引用还没被遍历过,在重新标记阶段会将这个对象标记为灰色

白色:这个对象没有被遍历过,在重新标记阶段如果是白色的话,这个对象将被回收

4.G1垃圾收集算法:

G1(Garbage-First),HotSpot 开发团队赋予它的使命是未来可以替换掉 CMS 收集器

优先清理垃圾占比较高的区域

其它收集器将堆分为新生代和老年代,进行收集的范围都是整个新生代或者老年代,而 G1 垃圾回收器不再将堆分成新生代和老年代,而是将整个内存切成一段一段大小相等的内存区域(每块区域称为region),每个region可能处于新生代或者老年代,所有处于新生代的region组成新生代,所有处于老年代的region组成老年代,也就是说新生代和老年代不再物理隔离

工作流程

(1)初始标记:标记所有直接与GC Root相连的对象,用户线程暂停,STW

(2)并发标记:多线程标记所有存活的对象,用户线程可以继续运行

(3)最终标记:由于上一个阶段并发标记阶段其他用户线程实际上还是在运行的,有可能用户线程在这个阶段产生了新的对象(这些新的对象中的存活对象是没有打上标记的)STW

(4)筛选回收:清理所有没被标记的对象

G1垃圾回收器可以设置一个垃圾回收的预期时间(比如指定这个垃圾回收器在一个小时之内发生stw的停顿时间不超过1分钟,这样回收器就会尽量在这个时间范围内完成垃圾回收任务)

 G1 把堆划分成多个大小相等的独立区域(Region),,通过引入 Region 的概念,从而将原来的一整块内存空间划分成多个的小空间,使得每个小空间可以单独进行垃圾回收。这种划分方法带来了很大的灵活性

记录每个 Region 垃圾回收时间以及回收所获得的空间(这两个值是通过过去回收的经验获得),然后维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的 Region。

 

  CMS垃圾回收器和G1垃圾回收器之间的区别:

(1)CMS是针对老年代的垃圾收集器,而G1既可以对年轻代,又可以对老年代进行收集

(2)CMS采用的是标记清除算法,会产生很多内存碎片,G1采用的是标记整理算法,避免了垃圾碎片

(3)CMS的设计目标是减少垃圾收集引起的用户线程暂停stop the world的时间,而G1垃圾回收器既能缩短暂停时间,又能适用于吞吐量较高的程序(相同时间内能处理更多任务)


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

相关文章

垃圾回收(一)

文章目录 1. 确定哪些对象还“存活”,哪些已经“死去”1.1 引用计数算法1.2 可达性分析算法1.3 引用 2.垃圾回收算法2.1 分代收集理论跨代引用 2.2 标记-清除算法2.3 标记-复制法2.4 标记-整理算法 垃圾收集需要完成的三件事: 哪些内存需要回收&#xff…

python 垃圾箱-垃圾回收

前戏 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,那什么样的变量值…

纪念第一届cccc天梯赛

来一篇迟到的文章 先来爆一下战绩吧:SDUT,学校排名全国第六获金,山东省冠军。学校一共三支队伍,学长们一支最强的队获一等奖,剩下的两支二等奖。 战绩总体来看还不错吧,离不开我们每一个队员和老师们的努…

2021 CCCC天梯赛补题

前言不想看请直接跳过~~~~ 前言检讨:天梯赛我拉垮了,我拖了队伍后腿,我有罪。 分析原因,首先是前一个星期训练量不够,没有跟上队友训练的进度,一些基础的STL的…

2021年CCCC天梯赛 【部分题题解】

天梯赛有三个level,第一个level基本就是语法题,第二个level是基础算法和STL库的一些应用。 第三个level就是一些难的算法。 L3的题都不是太会,有思路但是写不出来。 目录 L1人与神两小时学完C语言强迫症降价提醒机器人大笨钟的心情吉老师的回…

2021年CCCC天梯赛L3 还原文件题解

题目如下 一份重要文件被撕成两半,其中一半还被送进了碎纸机。 我们将碎纸机里找到的纸条进行编号,如图 1 所示。然后根据断口的折线形状跟没有切碎的半张纸进行匹配,最后还原成图 2 的样子。 要求你输出还原后纸条的正确拼接顺序。 图 1…

2020CCCC天梯赛补题记录

目录 总结补题L2-035 完全二叉树的层序遍历 (25分)L2-036 网红点打卡攻略 (25分)L3-025 那就别担心了 (30分)28分版本:30分版本(记忆化搜索) 总结 1.口罩那题打完就只剩三十分钟了,之后卡在了完全二叉树的层序遍历那题,就没有再敢往后看&…

2021 CCCC天梯赛L1补题

前言 这次天梯赛表现没有达到预期,L1的分没有拿全,L2有2题没考虑完全,总之很愧疚拖了队友后腿。今天先补上L1没拿满分的题。 L1补题 前言L1-078 吉老师的回归输入样例1输出样例1输入样例2输出样例2 思路代码实现 L1-080 乘法口诀数列输入样例…

CCCC天梯赛 L2-037 包装机

CCCC天梯赛 L2-037 包装机 一种自动包装机的结构如图 1 所示。 首先机器中有 N 条轨道,放置了一些物品。 轨道下面有一个筐。 当某条轨道的按钮被按下时,活塞向左推动,将轨道尽头的一件物品推落筐中。 当 0 号按钮被按下时,机械手…

2022年CCCC天梯赛题解

L1-1今天我要赢 原题链接 代码 #include<bits/stdc.h> #define int long long #define rep(i, a, b) for(int ia;i<b;i) #define Rep(i, a, b) for(int ia;i>b;--i) using namespace std; const int N 10005; inline int read(){int s0,w1;char chgetchar();wh…

第八届cccc团体程序设计天梯赛——个人参赛总结——无代码纯粹的参赛总结

第八届cccc团体程序设计天梯赛——个人参赛总结——无代码纯粹的参赛总结 目录 第八届cccc团体程序设计天梯赛——个人参赛总结——无代码纯粹的参赛总结引言~介绍一下cccc天梯赛&#xff08;选读&#xff09;开篇介绍&#xff08;以下是个人经历部分的分享&#xff09;赛前准备…

怎样合理地营销推广App和吸引住大量的客户提高转化?

开发App进行后&#xff0c;一切应用软件都必须营销推广&#xff0c;尤其是在互联网技术收益消退的情况下&#xff0c;怎样合理地营销推广和吸引住大量的客户总流量早已变成很多互联网公司最关注的难题。 APP运用引流方法工作中看上去很繁杂&#xff0c;难度系数很大&#xff0…

APP在应用市场内该如何做推广

苹果应用商城的自然流量都是通过精品推荐&#xff0c;畅销排行榜和搜索来获取的&#xff0c;此外&#xff0c;应用名称、副标题、应用截图视频、应用描述、用户评论、下载量、用户留存率还有曝光量&#xff0c;这些都是影响ASO优化的关键因素。 为了防止一些应用堆砌热词&…

App推广拉新的6大方式,你都玩得转吗?

中国的互联网发展至今,除了App以外,公众号,小程序在微信生态中的独领风骚,快应用也像“太子”一样在11家国产手机厂商的簇拥下茁壮成长,而百度的百家号、头条的头条号、阿里的大鱼号也已经和微信开始“正面刚”。App这种古老的产品形态,正受到市场的不断冲击。 根据Quest…

什么是App推广技术?

在移动互联网红利消失殆尽、市场竞争日趋激烈的背景下,App的推广越来越难了,如何去有效的进行推广,吸引更多的用户流量,成为了众多互联网企业最为关注的问题。 而App 推广技术指的就是通过一些技术的方式来提高 App 推广效率,帮助众多互联网企业,解决 App 推广难的问题。…

如何正确推广App,实现高转化用户。

个性化深度链接技术的应用。深度链接使网页和App两者串联起来&#xff0c;减少了转换漏斗中的损失。再加上深度链接不仅能改善潜在用户的转化&#xff0c;对沉睡用户的唤醒同样也能发挥关键作用。 类型不含深度链接使用深度链接携带参数首页商品的id号&#xff0c;房间号&…

电商App:提高推广转化率的几件事

双十一将至&#xff0c;电商App获客却越来越难&#xff0c;成本越来越高。想要做好用户拉新并转化为有效用户&#xff0c;这里整理了一套拉新留存方法论&#xff0c;可以参考使用。 一、找准目标用户 首先明确用户群定位&#xff0c;可以从年龄范围、职业范围、性别、地域、消…

微信开放平台unionID 的利用(app推广转化率的解决方案)

打开微信公众号开发文档&#xff0c;开幕就是这段话。微信开放平台提供了unionID 一个用户虽然对多个公众号和应用有多个不同的OpenID&#xff0c;但他对所有这些同一开放平台账号下的公众号和应用&#xff0c;只有一个UnionID 正常的app推广方案有很多平台在做&#xff0c;费…

小程序手写板电子签名

本人已经全部处理好&#xff0c;可以直接粘贴文件使用不予要修改&#xff0c;可保存图片到本地&#xff0c;也可以转成base64位码。源码地址&#xff1a;https://download.csdn.net/download/zzsjsp/11816038

怎么制作电子签名?

随着科技的进步&#xff0c;电子签名应用的领域更广泛&#xff0c;尤其是电子签名的法律效力问题上&#xff0c;通过技术手段实现签名和签署人身份对应&#xff0c;利用不可被更改的内容形式&#xff0c;保障签名的电子文件是原文&#xff0c;广泛应用于电子商务的场景。 电子签…