JVM:垃圾收集器(7种)

垃圾收集器关系图:

如果两个收集器之间存在连线,就说明它们可以搭配使用。它们说在的区域则表示这个收集器属于新生代收集器还是老年代收集器。其中Serial(串行)、Parallel(并行)

1、Serial收集器

        Serial收集器是最基础、历史最悠久的收集器,是HotSpot虚拟机新生代收集器的唯一选择。这个收集器是一个单线程工作的收集器。这个收集器再进行垃圾收集时,必须停掉所有的工作线程,直到收集完成。这个停掉的工作是后台自己执行的,用户并不知情。这个是我们无法接受的。

        从上面的种种缺点看去似乎这个收集器已经被时代抛弃,没有优点。但是它依旧是HotSpot虚拟机运行再客户端模式下默认的新生代收集器。因为它有一个很大的优点简单而高效。再内存环境受限的环境,它是所有收集器里面的额外内存消耗最小的。一般来说分配给虚拟机管理的内存一般不会特别大,对于几十兆甚至一两百兆的新生代,Serial垃圾收集器的停顿时间完全可以控制再可接受范围。所以, Serial收集器对于运行在客户端模式下的虚拟机来说是一个很好的选择。

2、ParNew收集器

        ParNew收集器实质上是Serial收集器的多线程并行版本,出来可以同时多条线程进行垃圾收集外,其余行为几乎与Serial收集器一致。

         这个收集器明明没有太大的创新为什么能有怎么重要的地位呢,那就是因为它的搭档CMS收集器。CMS第一款真正意义上支持并发的垃圾收集器,它首次 实现了让垃圾收集线程与用户线程同时工作。但这个收集器只能Serial和ParNew这两个新生代收集器配合使用。这样奠定了ParNew的地位。随着G1收集器的产生,这一组合被逐渐取代,官方希望它能完全被G1所取代,ParNew和CMS从此只能互相搭配使用,再也没有其他收集器能够和它们配合了。也可以理解为从此以后,ParNew合并入CMS,成为它专门处理新生代的组成部分。ParNew可以说是HotSpot虚拟机中第一款退出历史舞台的垃圾收集器。

3、Parallel Scavenge收集器

        Parallel Scavenge收集器是一款新生代收集器,它基于标记复制算法实现。也是能够并行收集的多线程收集器。它独特的点在于它的注重点与其他收集器不同,CMS等收集器的关注点是尽可能的缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge的注重点是一个可控的吞吐量。

注重停顿时间的垃圾收集器适合注重用户良好体验的程序,而高吞吐量则是更高效的利用资源,尽快完成程序的运算任务,适合在后台不需要过多交互的程序。

这个收集器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间 的-XX:MaxGCPauseMillis参数以及直接设置吞吐量大小的-XX:GCTimeRatio参数。 -XX:

4、Serial Old收集器

        Serial Old是Serial收集器的老年版本,它是一个单线程收集器,使用标记整理算法。这个收集器的主要作用是再客户端模式下的HotSpot虚拟机使用。再服务端下一种是JDK5即以前与ParallelScavenge收集器搭配使用,另一种就是作为CMS收集器发生失败时的后背预案。

5、Parallel Old收集器

        parallel Old是parallel Scavenge收集器的老年版本,支持多线程并发收集,基于标记整理算法实现。出现在JDK6后。当注重吞吐量或者处理器资源稀缺的时候,都会优先考虑                parallel Scavenge+Parallel Old收集器这个组合。

6、CMS收集器 (并发收集、低停顿)

        CMS(Concurrent Mark Sweep)收集器是以获取最短回收停顿时间的为目标的收集器。注重服务的响应速度,希望系统停顿时间尽可能短,以给用户更好的交互体验。这个收集器是基于标记清除算法实现的。用于老年代的收集。

收集过程有四个阶段:1、初始标记        2、并发标记        3、重新标记        4、并发清除

        四个阶段中初始标记重新标记仍需要暂停所有的用户线程(Stop The World),但为什么说这个收集器也暂停了所有的线程,为什么还能做到停顿时间短呢。因为初始标记阶段只是标记GC Roots能直接关联的对象,这个过程很快。而并发标记时才进行沿GC Roots遍历所有对象,这个工作量说不小的,但这个过程并没有停顿用户线程,而是与其并发执行,如果再过程出现对象引用关系改变,则使用增量更新的方法将其标记。待重新标记阶段就是为了解决这个并发过程中因为改变而被标记的对象。这个阶段是要暂停用户线程的,但这部分的工作量也不大。最后全部标记玩就进入了并发清除的阶段了。这部分也是与用户线程并发进行的。

从整体上看来耗时长的并发标记和并发清除都没有暂停用户线程,所有可以说:从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

缺点: 

  1. CMS收集器对CPU资源很敏感。它虽然不会导致用户线程停顿,但也会因为占用一部分线程导致应用程序变慢。它默认启动的回收线程数是(核心线程数+3)/4,所以随着核心线程数的降低,CMS收集器的弊端会越来越明显。
  2. CMS是一款基于“标记-清除”算法实现的收集器,这意味着收集结束时会有大量空间碎片产生。空间 碎片过多时,将会给大对象分配带来很大麻烦,往往会出现老年代还有很多剩余空间,但就是无法找 到足够大的连续空间来分配当前对象,所以会提前导致Full GC的到来。
  3. CMS无法处理浮动垃圾(再清除阶段用户线程还在运行,产生的垃圾)。必须等到下次GC时才能清理,而且不能等到老年代满了后再清理,因为再清理过程中用户线程还在产生对象,所以要预留一定内存,提前开启垃圾清理。

7、G1收集器(Garbage First)

        G1是一种“停顿时间模型”的收集器,它能指定时间N,确保消耗再垃圾收集上时间大概率不超过N毫秒的目的。G1收集器一改之前的分区收集思想,开创了面对局部收集的设计思路。它将java堆划分为多个大小相等的独立区域Region。它可以面对堆内存任何部分组成回收集进行回收。这个模型回收哪块的衡量标准是哪块Region垃圾最多,再N毫秒内回收收益最大。这就是G1收集器的Mixed GC模式。

        再并发操作阶段,CMS收集器采用增量更新算法实现,而G1 收集器则是通过原始快照(SATB)算法来实现的。

收集过程:

  1. 初始标记:仅仅只是标记一下GC Roots能直接关联到的对象,需要暂停用户线程,但耗时很短。
  2. 并发标记:从GC Root开始对堆中对象进行可达性分析,递归扫描整个堆 里的对象图,找出要回收的对象,这阶段耗时较长,但可与用户程序并发执行。当对象图扫描完成以 后,还要重新处理SATB记录下的在并发时有引用变动的对象。 ·
  3. 最终标记:对用户线程做另一个短暂的暂停,用于处理并发阶段结束后仍遗留 下来的最后那少量的SATB记录。 ·
  4. 筛选回收:负责更新Region的统计数据,对各个Region的回 收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划,可以自由选择任意多个Region 构成回收集,然后把决定回收的那一部分Region的存活对象复制到空的Region中,再清理掉整个旧 Region的全部空间。这里的操作涉及存活对象的移动,是必须暂停用户线程,由多条收集器线程并行 完成的。

        毫无疑问,可以由用户指定期望的停顿时间是G1收集器很强大的一个功能,设置不同的期望停顿 时间,可使得G1在不同应用场景中取得关注吞吐量和关注延迟之间的最佳平衡。当然这个值也得是一个可能的值,要是太低了,就会导致每次回收不了多少,回收次数增加。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/335477.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core 对象池化技术

写在前面 Microsoft.Extensions.ObjectPool 是 ASP.NET Core 基础结构的一部分,当对象的初始化成本较高,并且可能被频繁使用时,才适合采用对象池技术;被ObjectPool管理的对象不会进入垃圾回收,使用时通过由实例对象实…

市场复盘总结 20240119

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 昨日主题投资 连板进级率 11/39 28.2% 二进三: 进级率低 43% 最常用的二种方法: 方…

[AI]文心一言爆火的同时,ChatGPT-4.5的正确打开方式

前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

【PICO】【VRTK】PICO项目后打包后在头盔中运行时不追踪

【背景】 PICO项目打包后可以在头盔中运行,但是画面是贴脸移动的,无法发生有效的空间追踪。 【解决办法】 我的Unity版本是2021.3.30LTS,ProjectSettings中的NetFramework默认是2.1。改到NetFramework后再打包就正常了。

安捷伦N5222A网络分析仪26.5GHz

安捷伦N5222A网络分析仪 N5222A 是 Agilent 的 26.5 GHz 网络分析仪。网络分析仪是一种功能强大的仪器,可以以无与伦比的精度测量射频设备的线性特性。许多行业使用网络分析仪来测试设备、测量材料和监控信号的完整性。 附加功能: 10 MHz 至 26.5 GHz 2…

el-table样式错乱解决方案

bug: 图片的椭圆框住的地方,在页面放大缩小之后就对不齐了。 原因: 主要原因是当你对页面放大缩小的时候,页面进行了重构,页面的宽高及样式进行了变化,但是在这个更新的过程中,table的反应并没…

git使用的常用指令

git作为一个版本控制工具,和maven并合称为实习的两大杀手工具。今天我来给大家介绍一下git的常用指令,帮助大家在实习和多人协同开发的时候提供一些帮助。 找到git管理的文件夹 命令1 git init 这个命令是为了初始化本地库 命令2 查看当前的git状态…

怎么做表单链接_从表单链接到营销策略

从表单链接到营销策略:一场无与伦比的转化之旅 在数字营销的世界里,表单链接是一种至关重要的元素。它不仅是一个简单的链接,更是企业与潜在客户之间建立联系的桥梁。如何将表单链接巧妙地融入营销策略,让潜在客户转化为真正的客…

JUC并发编程-线程和进程、Synchronized 和 Lock、生产者和消费者问题

1、什么是JUC 源码 官方文档 面试高频问! java.util 工具包、包、分类 业务:普通的线程代码 Thread Runnable Runnable 没有返回值、效率相比入 Callable 相对较低! 2、线程和进程 线程、进程,如果不能使用一句话说出来的技术…

力扣36. 有效的数独

模拟 思路: 使用三个哈希表来存储数字个数 row[r][val] 用于存储第 r 行 val 1 的个数;column[c][val] 用于存储第 c 列 val 1 的个数; subboxes[i][j][val] 用于存储第 i 行、第 j 列个小九宫格 val 1 的个数,其中&#xff1…

论文笔记:基于CLIP引导学习的多模式假新闻检测

整理了ICME2023 Multimodal Fake News Detection via CLIP-Guided Learning)论文的阅读笔记 背景模型实验 背景 对于我们这一代人来说,在线社交网络在很大程度上取代了以报纸和杂志为代表的传统信息交流方式。人们喜欢在社交媒体上寻找朋友或分享观点。然…

Linux系统安装NFS服务器

NFS是一种网络文件系统,英文全称Network File System,通过NFS可以让不同的主机系统之间共享文件或目录。通过NFS,用户可以直接在本地NFS客户端读写NFS服务端上的文件,是非常好的共享存储工具。本篇文章将介绍如何在CentOS7上安装N…

2024年【G2电站锅炉司炉】考试报名及G2电站锅炉司炉复审考试

题库来源:安全生产模拟考试一点通公众号小程序 G2电站锅炉司炉考试报名是安全生产模拟考试一点通生成的,G2电站锅炉司炉证模拟考试题库是根据G2电站锅炉司炉最新版教材汇编出G2电站锅炉司炉仿真模拟考试。2024年【G2电站锅炉司炉】考试报名及G2电站锅炉…

在WIN从零开始在QMUE上添加一块自己的开发板(一)

文章目录 一、前言二、源码编译(一)安装Msys2(二)配置GCC工具链(三)安装QEMU构建依赖(四)下载编译QEMU源码 二、QUME编程基础(一)QOM机制(二&…

如何有效防爬虫?一文讲解反爬虫策略

企业拥抱数字化技术的过程中,网络犯罪分子的“战术”也更难以觉察,并且这些攻击越来越自动化和复杂,也更加难以觉察。在众多攻击手段中,网络爬虫是企业面临的主要安全挑战。恶意爬虫活动可能导致数据滥用、盗窃商业机密等问题&…

MySQL之索引结构

索引概述 索引是帮助MySQL高效获取数据的数据结构(有序)。 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现…

Ubuntu使用docker-compose安装chatGPT

ubuntu环境搭建专栏🔗点击跳转 Ubuntu系统环境搭建(十五)——使用docker-compose安装chatGPT Welcome to the AI era! 使用docker compose安装 在/usr/local文件夹下创建chatgpt mkdir chatgpt创建docker-compose.yaml vim docker-compos…

springcloud OpenFeign服务接口调用

文章目录 代码下载地址OpenFeign简介OpenFeign使用步骤测试 OpenFeign超时控制超时设置,故意设置超时演示出错情况服务提供方8001故意写暂停程序服务消费方80添加超时方法PaymentFeignService服务消费方80添加超时方法OrderFeignController测试YML文件里需要开启Ope…

考研C语言刷编程题篇之分支循环结构基础篇(一)

目录 第一题 第二题 方法一:要循环两次,一次求阶乘,一次求和。 注意:在求和时,如果不将sum每次求和的初始值置为1,那么求和就会重复。 方法二: 第三题 方法一:用数组遍历的思想…

Windows给docker设置阿里源

windows环境搭建专栏🔗点击跳转 Windows系统的docker设置阿里源 文章目录 Windows系统的docker设置阿里源1.获得镜像加速器2.配置docker 由于我们生活在中国大陆,所以外网的访问总是那么慢又困难,用docker拉取几兆的小镜象还能忍受&#xff…