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

前言

前段时间我们学习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

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

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

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

相关文章

windows 系统安装sonarqube

SonarQube是一种自动代码审查工具,用于检测代码中的错误,漏洞和代码异味。它可以与您现有的工作流程集成,以便在项目分支和拉取请求之间进行连续的代码检查。 官方网站: https://www.sonarqube.org/ 1. 使用前提条件 运行SonarQ…

FCPX插件-15组金色华丽粒子特效闪耀动画 Awards Backgrounds

Awards Backgrounds是fcpx上一个很棒的电影级效果插件,Awards Backgrounds 包含15组金色华丽粒子特效闪耀动画,可以为您的作品创建豪华的背景或叠加特效!包含各种带有可编辑颜色的下落闪闪发光粒子的场景。用于展示奖项提名者、优雅的表演、祝…

【历史上的今天】7 月 24 日:Caldera 诉微软案;AMD 宣布收购 ATI;谷歌推出 Chromecast

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 7 月 24 日,在 1951 年的今天,晶体管发明家 John Bardeen 通知 AT&T 贝尔实验室,他将离开公司,与 Walter B…

数据结构【数组、串、广义表】

第四章 数组、串、广义表 一、数组 1.概念:线性表是通过数组实现的,数组是线性表的推广,数组只有存取元素和修改元素的操作(除了初始化和销毁); 2.数组的存储结构:一个数组的所有元素在内存中占…

动手学DL——深度学习预备知识随笔【深度学习】【PyTorch】

文章目录 2、预备知识2.1、数据操作2.2、线性代数&矩阵计算2.3、导数2.4、基础优化方法 2、预备知识 2.1、数据操作 batch:以图片数据为例,一次读入的图片数量。 小批量样本可以充分利用GPU进行并行计算提高计算效率。 数据访问 数组:np…

Java运算符

大体上,与C语言差不多,不同的地方,我用红色字体标注了 算术运算符 1. 基本四则运算符:加减乘除模 ( - * / %) int a 10 ; int b 20 ; System . out . println ( a b ); // 30 System . out . println ( a - b…

二十三种设计模式第十八篇--责任链模式

责任链模式是一种行为型设计模式,它允许你将请求沿着处理者链传递,直到有一个处理者能够处理该请求为止。责任链模式将请求发送者和请求处理者解耦,从而使得多个处理者都有机会处理同一个请求。 该模式包含以下几个关键角色: 抽象…

macOS 源码编译 qpress

╰─➤ git clone https://github.com/PierreLvx/qpress.git ╰─➤ cd qpress ╰─➤ make g -O3 -o qpress -x c quicklz.c -x c qpress.cpp aio.cpp utilities.cpp -lpthread -Wall -Wextra -Werror ╰─➤ sudo make install …

k8s deployment(k8s经典版)|PetaExpress

Deployment是什么? Deployment是指在软件开发中将应用程序或系统部署到目标环境中的过程。它包括将代码编译、配置、打包并安装到目标服务器或设备上的步骤。k8s deployment是(k8s经典版)中用来管理发布的控制器,在开发的过程中使…

Ubuntu18.04系统安装视频剪辑软件shotcut

Snap Store安装 使用的是最新的Ubuntu 18.04 LTS(Bionic Beaver),其本身已安装Snap 如果没有安装,则可以使用以下命令安装SNAP $ sudo apt-get install snapd安装shotcut $ sudo snap install shotcut --classic启动shotcut $…

读kafka生产端源码,窥kafka设计之道(下)

背景 在上一篇文章《读kafka生产端源码,窥kafka设计之道(上)》 留下了kafka设计上比较优秀的一个点;内存的循环使用。本篇文章准备盘盘它。 好奇 为什么 kafka减少发送消息时向JVM频繁申请内存,就可以降低JVM GC的执…

【深度学习之YOLO8】视频流推断

官方V8模型下载 需要准备两个东西 simsun.ttc字体包YOLOv8官方模型成品 ScreenCapture屏幕图像类 import cv2 import mss import numpy as npclass ScreenCapture:"""parameters----------screen_resolution : Tuple[int, int]屏幕宽高,分别为x&a…

最新基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作方法

文献计量学是指用数学和统计学的方法,定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体,注重量化的综合性知识体系。特别是,信息可视化技术手段和方法的运用,可直观的展示主题的研究发展历程、研究现状、研究…

2023年Q2京东小家电市场数据分析(京东数据运营)

伴随人们对生活品质追求的提高,以及拥有新兴消费理念的年轻人逐渐成为消费主力,功能新潮、外观精致的小家电经常在电商平台销售榜单里“榜上有名”。本期我们便一起来分析Q2京东小家电市场中,一些较为热门的精致生活小电的行业大盘变动情况。…

使用node内置test runner,和 Jest say 拜拜

参考 https://nodejs.org/dist/latest-v20.x/docs/api/test.html#test-runner 在之前,我们写单元测试,必须安装第三方依赖包,而从node 20.0.0 版本之后,可以告别繁琐的第三方依赖包啦,可直接使用node的内置test runner…

js实现窗口的左右及上下拖拽

<template><div class"Drag2"><div class"box" ref"box"><div class"left"><!--左侧div内容--></div><div class"resize" title"左右侧边栏" draggable"true" …

Jupyter 安装、简单操作及工作路径更换

一、Jupyter下载安装 pip install jupyterAnaconda是Python另一个非常流行的发行版&#xff0c;它之后有着自己的叫做“conda”的安装工具。用户可以使用它来安装很多第三方包。然而&#xff0c;Anaconda会预装很多包&#xff0c;包括了Jupyter Notebook,所以若已经安装了Anac…

QT项目打包成软件进行发布的三种方式

目录 一、打包成绿色便携版 二、打包成单文件版 三、打包成可安装版本 本教程对应的IDE是Qt Creater。 保证绿色便携版能正常运行才能够打包成单文件版本和可安装版本。 一、打包成绿色便携版 特点&#xff1a;给别人发送的时候需要先制作成一个压缩包文件&#xff0c;解…

低代码未来的发展方向

&#x1f482; 个人网站:【办公神器】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 大的未来都是AI &#x…

vue element select下拉框回显展示数字

vue element select下拉框回显展示数字 问题截图&#xff1a; 下拉框显示数字可以从数据类型来分析错误&#xff0c;接收的数据类型是字符串&#xff0c;但是value是数字类型 <el-form-item prop"classifyLabelId" :label"$t(item.classifyLabelId)"…