p7付费课程笔记5:串行gc以及并行gc

news2024/10/5 14:44:32

前言

前段时间我们学习jvm的基础结构和gc相关的基础知识,今天我们详细讲讲几大gc。

串行gc

串行 GC 对年轻代使用 mark-copy (标记-复制) 算法,对老年代使用 mark-sweep-compact (标记-清除-整理) 算法。

两者都是单线程的垃圾收集器,不能进行并行处理,所以都会触发全线暂停(STW),停止所有的应用线程因此这种 GC 算法不能充分利用多核 CPU。不管有多少 CPU 内核,JVM 在垃圾收集时都只能使用单个核心。CPU 利用率高,暂停时间长。简单粗暴,就像老式的电脑,动不动就卡死。该选项只适合几百 MB 堆内存的 JVM,而且是单核 CPU 时比较有用。想想 why?

-XX:+USeParNewGC 改进版本的 Serial GC,可以配合 CMS 使用

串行垃圾收集器(Serial Collector)是最基本、历史最悠久的垃圾收集器,它在垃圾收集的过程中会暂停其他所有的工作线程,也就是人们常说的 "Stop-The-World"。串行收集器在进行垃圾收集时只使用一个CPU或一个收集线程完成,它不仅会导致用户当前正在运行的线程停止,还不会效率地利用多核处理器的优势。

在JVM启动时,通过以下参数可以开启串行垃圾收集器:

  • Yyoung代:-XX:+UseSerialGC
  • Old代:-XX:+UseSerialOldGC

串行垃圾收集器是一款STW(Stop The World)的收集器,当它在运行时,用户线程会被全部挂起,在完成垃圾收集之前不能恢复运行。

串行垃圾收集器的优点是简单高效(与其他收集器的单线程相比),缺点是在进行垃圾收集时需要暂停所有应用线程,因此不适用于对响应时间有较高要求的应用。

适用场景

尽管串行GC停止所有的应用线程,且只有一个线程参与垃圾收集,但在以下几个场景中,串行GC仍然是一个不错的选择:

  1. 单核处理器环境:对于只有一个或两个处理器的系统,因为并行/并发执行会产生过多的线程切换和同步开销,所以串行垃圾收集器的停顿时间反而更短。
  2. 对延迟不敏感的后台应用:如果应用能够容忍短暂的停顿时间,比如一些后台的批处理程序,可以选用串行垃圾收集器。
  3. 内存较小的环境:串行垃圾收集器对内存的管理相对简单高效。如果应用的堆内存不大(约100MB以内),或者对内存利用率要求高的系统中,可能更适合使用串行GC。
  4. 嵌入式系统:串行垃圾收集器由于它的高效简单性,还被广泛使用在许多嵌入式系统或者Java ME设备中。

要启用串行GC,可以使用JVM参数-XX:+UseSerialGC。

内存分布

假设内存大小为4GB,并以此为基础,以下是一个基于4GB堆内存的串行垃圾收集器(Serial GC)的例子,涉及年轻代和老年代的内存分布:

年轻代内存分布:

  • Eden空间:初始占用3GB,用于对象的初始分配。
  • Survivor空间:由两个区域组成,每个区域占用512MB(根据具体配置可能会有所差异),例如一个名为From区和另一个名为To区。

老年代内存分布:

  • 占用512MB,用于存放经过多次垃圾回收仍然存活的对象。

当Eden空间和To区的内存占用达到一定阈值时,会触发Minor GC,清理Eden空间和From区的无用对象,并将存活的对象复制到To区。当老年代的内存使用率达到一定阈值或需要进行Full GC时,会触发Major GC,清理整个堆空间的垃圾。

并行gc

年轻代和老年代的垃圾回收都会触发 STW 事件在年轻代使用 标记-复制 (mark-copy) 算法,在老年代使用 标记-清除-整理mark-sweepcompact) 算法。

XX:ParallelGCThreads=N 来指定 GC 线程数,其默认值为 CPU 核心数。

并行垃圾收集器适用于多核服务器,主要目标是增加吞吐量。因为对系统资源的有效使用,能达到更高的吞吐量:

  • 在 GC 期间,所有 CPU 内核都在并行清理垃圾,所以总暂停时间更短;
  • 在两次 GC 周期的间隔期,没有 GC 线程在运行,不会消耗任何系统资源;
  • 一般来说它的吞吐量是最优的,但是吞吐量最优不一定是gc暂停时间最短;

并行垃圾收集器的几个重要JVM参数:

  1. -XX:+UseParallelGC:启用并行垃圾收集器,这将改变Java虚拟机中默认的垃圾收集器。
  2. -XX:ParallelGCThreads=n:设置并行垃圾收集器的线程数。通常,我们可以设置这个参数和逻辑处理器数一样。
  3. -XX:+UseParallelOldGC:指定老年代使用并行回收收集器,并行收集多个线程一起回收老年代空间。
  4. -XX:MaxGCPauseMillis=n : 这个参数核心目标是控制最大的垃圾收集的暂停时间。它的默认值是一种比较模糊的目标,JVM将会尽可能地(但是不能保证)达到这个暂停时间。

使用并行GC在多处理器(CPU核心数多)并且有大量内存的环境中,可以充分利用硬件资源以获取尽可能高的吞吐量,所以这种GC方式非常适合在后台计算类的应用,没有交互的场景。

适用场景

  1. 吞吐量优先的应用:并行垃圾收集器在追求系统的吞吐量方面表现出色。对于一些需要最大化处理能力的应用,如数据处理、图像处理、视频流处理等,可以选择并行垃圾收集器来保持高吞吐量。
  2. 批处理任务:并行垃圾收集器非常适合处理大量数据的批处理任务。这种类型的任务通常对处理速度和系统的资源利用率有较高的要求,而并行垃圾收集器可以利用多核处理器的能力并行处理垃圾回收,减少系统停顿的时间。
  3. 后台服务应用:对于后台服务应用,如服务器、网络服务、数据库等,这些应用通常需要处理大量的并发请求。并行垃圾收集器可以快速回收垃圾,减少应用程序的停顿时间,提高整体的系统响应能力。
  4. 大内存堆应用:由于并行垃圾收集器能够有效利用多个线程进行垃圾回收,因此它适用于具有大内存堆的应用场景。对于需要使用大内存的应用,如内存数据库、物理模拟、科学计算等,使用并行垃圾收集器可以更快地完成垃圾回收,减少应用停顿的时间。

非适用场景

  1. 实时系统:对于需要实时响应和低延迟的系统,如交互式GUI应用、高频交易系统等,由于并行垃圾收集器会在GC期间暂停应用线程,这可能导致系统的响应时间不稳定或产生较大的延迟。
  2. 对象创建和销毁频繁的业务功能:如果业务逻辑中有大量创建和销毁对象的操作,由于并行垃圾收集器会产生较长的停顿时间,导致频繁的GC可能会严重影响业务的性能。
  3. 低内存环境:如果应用程序的可用内存非常有限,使用并行垃圾收集器可能会导致过多的系统资源被垃圾回收过程占用,导致系统出现更长的停顿时间,以及内存资源的浪费。
  4. 大对象(Large Object):并行垃圾收集器在处理大对象时可能会造成较大的停顿,因为大对象需要更多的时间来复制或清除,从而影响了整个垃圾回收过程的效率。在有大量大对象的场景下,可以考虑其他垃圾收集器策略。

并行GC中不同回收线程之间是如何协作对堆内存进行回收?

在并行GC中,不同的回收线程会同时工作来对堆内存进行垃圾回收。它们会协同工作以实现高效的垃圾收集。

在年轻代的垃圾回收过程中,会将堆内存分为多个区域(一般是2~16个),每个区域由一个线程负责进行垃圾回收。这些线程会同时进行垃圾标记和复制操作,以提高垃圾回收的效率。垃圾标记阶段会遍历对象图,标记出存活的对象,将存活的对象复制到另一个区域中。最后,回收线程会对其负责区域中的垃圾进行回收。

在老年代的垃圾回收过程中,各个回收线程会使用并行方式进行标记和清除操作,并行进行垃圾回收。垃圾标记阶段会遍历对象图进行标记,标记出存活的对象。然后,在清除阶段,垃圾回收线程会并行清理不再存活的对象,并整理堆空间来解决内存碎片问题。

在并行GC过程中,因为涉及到并行协作,所以需要一定的线程同步和协调机制来确保并发操作的正确性。同时,在进行并行垃圾回收时,也需要考虑到线程之间的负载平衡以及避免线程竞争和死锁等问题。

通过并行化的垃圾回收方式,可以充分利用多个处理器核心,提高垃圾回收的效率和整体吞吐量。然而,需要注意的是,并行化的垃圾回收也会引入一些额外的开销,如线程切换和同步开销。因此,在特定的应用场景中,需要根据实际情况进行性能测试和调优,以确定合适的垃圾收集策略。

内存分布

对于一个4GB的内存堆,下面是一个基于并行GC(Parallel GC)的例子,涉及年轻代和老年代的内存分布:

年轻代内存分布:

  • Eden空间:初始占用2GB,用于对象的初始分配。
  • Survivor空间:由两个区域组成,每个区域占用256MB(根据具体配置可能会有所差异),例如一个名为From区和另一个名为To区。

老年代内存分布:

  • 占用1.5GB,用于存放经过多次垃圾回收仍然存活的对象。

与串行GC相比,并行GC会使用多个线程并行进行垃圾回收,以提高内存回收的效率和吞吐量。

在年轻代的垃圾回收过程中,同时对Eden空间和Survivor区进行回收。当Eden空间和To区的内存占用达到一定阈值时,触发Minor GC,清理Eden空间和From区的无用对象,并将存活的对象复制到To区。

在老年代的垃圾回收过程中,多线程并行进行标记和清除操作。标记阶段会遍历老年代对象图,标记存活的对象。然后,在清除阶段,会并行清理不再存活的对象,并整理堆空间来解决内存碎片问题。

需要注意的是,并行GC的具体内存分布会受到具体的JVM参数配置和垃圾收集器策略的影响。使用相关监控工具和命令(如jstat、jmap等),可以获取更准确的内存使用情况和垃圾回收相关的数据。

视频

链接:https://www.aliyundrive.com/s/CicYB9XtnEK

今天就到这里吧,感觉有用的小伙伴可以点个赞,你的支持就是我更新的最大动力!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百度AI成为移动生态强者的真相

移动互联网的发展,让移动生态成为了互联网企业竞争的重要战场。在这场竞争中,百度AI凭借着其优质的技术实力和完善的生态系统,成为了移动生态中的强者。 那么,百度AI究竟靠什么成为了强者呢?首先,百度AI的技…

网络安全/黑客零基础入门(经验分享)

相关网站推荐 博主研究方向为安全领域,以后可能更多的在圈子内发表文章,提高文章质量。 1、FreeBuf 国内关注度最高的全球互联网安全媒体平台,爱好者们交流与分享安全技术的社区,网络安全行业门户。 2、看雪 看雪论坛是个软件…

GB/T 25000.51解读——软件产品的兼容性怎么测?

GB/T 25000.51-2016《软件产品质量要求和测试细则》是申请软件检测CNAS认可一定会用到的一部国家标准。在前面的文章中,我们为大家整体介绍了GB/T 25000.51-2016《软件产品质量要求和测试细则》国家标准的结构和所涵盖的内容以及对软件产品的八大质量特性中的功能性…

Failed to load local font resource:微信小程序加载第三方字体

加载本地字体.ttf 将ttf转换为base64格式:https://transfonter.org/ 步骤如下 将下载后的stylesheet.css 里的font-family属性名字改一下,然后引进页面里就行了,全局样式就放app.scss,单页面就引入单页面 注: .title…

Jmeter+MySQL链接+JDBC Connection配置元件+使用

参考大大的博客学习:怎么用JMeter操作MySQL数据库?看完秒懂!_jmeter mysql_程序员馨馨的博客-CSDN博客 注:里面所有没打码的都是假数据,麻烦大家自行修改正确的信息。 一、背景 需要取数据库中的值,作为…

html2Canvas+jsPDF 下载PDF 遇到跨域的对象存储的图片无法显示

一、问题原因 对象存储的域名和你网址的域名不一样,此时用Canvas相关插件 将DOM元素转化为PDF,就会出现跨域错误。 二、解决办法 两步 1. 图片元素上设置属性 crossorigin"anonymous" 支持原生img和eleme组件 2. 存储桶设置资源跨域访问…

盘点!项目管理软件排行榜前十名

如今企业规模不断扩大,业务逐渐复杂化,项目管理已经成为现代企业管理中不可或缺的一环。作为协调管理者、团队成员和客户之间交流的工具,项目管理软件不仅可以提高工作效率,还可以提高项目成功的几率,对于企业具有重要…

[小尘送书-第二期]《从零开始读懂量子力学》由浅入深,解释科学原理;从手机到超导,量子无处不在;从微观到宏观,遐想人生的意义!

大家好,我是小尘,欢迎关注,一起交流学习!欢迎大家在CSDN后台私信我!一起讨论学习,讨论如何找到满意的工作! 本文目录 一、前言二、作者简介三、内容简介四、抽奖方式五、名家推介写在最后 一、前…

Linux使用教程

一、Linux命令基础 1、ls、ll命令——展示数据 ①ls命令——平铺展示数据 其中ls命令以平铺的方式展现数据 ②ll命令——列表展示数据 ll命令以列表的方式展现数据 -a选项,表示:all的意思,即列出全部文件(包含隐藏的文件/文件夹…

【Vue】div标签实现输入框,利用contenteditable=“true“属性的标签实现

推荐个链接&#x1f517;&#xff0c;可以更好的查阅自己遇到的问题&#xff08;点击此处即可跳转&#xff09; 使用 div 实现 input、textarea 输入框 <template><div class"content"><div class"main editTextList" ><divclass&q…

[c++实验] 快读快写,O123优化,原版用时对比

前言 学过c的多知道&#xff0c;准确的来说是做过c题目的都知道&#xff1a;c题目不仅要求代码正确&#xff0c;还要求用时&#xff0c;大多用时要求都在200ms--1000ms之间&#xff0c;要是遇到大数据时&#xff0c;超时的可能就会大大提升。 结论 用时的把控也很重要&#…

网站实现下载apk安装包

目录 1、背景说明2、效果图3、具体实现3.1 界面代码3.2 js代码 4、说明4.1 存在异常4.2 解决方案 5、参考资料 1、背景说明 有时需要将写好的apk安装包在局域网内部进行发布&#xff0c;具体实现非常简单&#xff0c;如下所示 2、效果图 进入到网站后&#xff0c;点击下载按…

正确认识:2374782-02-0,FAPI-4,成纤维细胞活化蛋白抑制剂

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ PART1----试剂基础信息​​ 【中文名称】成纤维细胞活化蛋白抑制剂 【英文名称】 FAPI-4 【结 构 式】 【CAS】2374782-02-0 【分子式】C40H54F2N10O10 【分子量】872.93 【沸点】1144.165.0 C(Predicted) 【密度】1.460.…

【力扣周赛】第 355 场周赛(构造二分答案异或前缀 状态压缩⭐)

文章目录 Q1&#xff1a;6921. 按分隔符拆分字符串&#xff08;双指针&#xff09;Q2&#xff1a;6915. 合并后数组中的最大元素&#xff08;倒序遍历贪心&#xff09;代码优化 Q3&#xff1a;6955. 长度递增组的最大数目&#x1f6b9;&#x1f6b9;&#x1f6b9;&#x1f6b9;…

企业级PaaS低代码快开平台源码,基于 Salesforce Platform 的开源替代方案

PaaS低代码快开平台是一种快速开发应用系统的工具&#xff0c;用户通过少量代码甚至不写代码就可以快速构建出各种应用系统。 随着信息化技术的发展&#xff0c;企业对信息化开发的需求正在逐渐改变&#xff0c;传统的定制开发已经无法满足企业需求。低代码开发平台&#xff0…

ElementUI tabs标签页样式改造美化

今天针对ElementUI的Tabs标签页进行了样式修改&#xff0c;更改为如下图所属的样子。 在线运行地址&#xff1a;JSRUN项目-ElementUI tabs标签页样式改造 大家如果有需要可以拿来修改使用&#xff0c;下面我也简单的贴上代码&#xff0c;代码没有注释&#xff0c;很抱歉&#x…

Centos7.9安装瀚高数据库企业版6.0.4_并开启远程连接_使用瀚高连接工具操作_亲测成功---国产瀚高数据库工作笔记003

1.首先去瀚高官网,注册,然后下载安装包, OpenEuler23.03欧拉系统_安装瀚高数据库企业版6.0.4_openeuler切换root用户_su:拒绝权限_passwd: 鉴定令牌操作错误---国产瀚高数据库工作笔记001 一部分内容可以参考一下这个博文 2.准备一下环境: 关闭防火墙,关闭网络管理器 syste…

Spingboot yaml 配置文件及数据读取

属性配置在这里插入图片描述 修改服务器端口 → server.port80 修改 banner → spring.main.banner off(关闭)/console(控制台)/log(日志) 日志 → logging.level.rootinfo Common Application Properties 配置文件分类 优先级 如果三种文件共存时&#xff0c;优先级为&am…

618技术揭秘 - 大促弹窗搭投实践 | 京东云技术团队

背景 618 大促来了&#xff0c;对于业务团队来说&#xff0c;最重要的事情莫过于各种大促营销。如会场、直播带货、频道内营销等等。而弹窗作为一个极其重要的强触达营销工具&#xff0c;通常用来渲染大促氛围、引流主会场、以及通过频道活动来提升频道复访等。因此&#xff0…

基本数据类型转换(基本数据类型之间的运算规则)

自动类型转换 前提&#xff1a;这里讨论只是7种基本数据类型变量间的运算。不包含boolean类型的。 自动类型转换&#xff1a;容量小的类型自动转换为容量大的数据类型。数据类型按容量大小排序为&#xff1a; 有多种类型的数据混合运算时&#xff0c;系统首先自动将所有数据 …