【从零开始学习JVM | 第九篇】了解 常见垃圾回收器

前言:

垃圾回收器(Garbage Collector)是现代编程语言中的一项重要技术,它提供了自动内存管理的机制,极大地简化了开发人员对内存分配和释放的繁琐工作。通过垃圾回收器,我们能够更高效地利用计算机的内存资源,减少内存泄漏和程序崩溃的风险。

随着软件应用程序的复杂性不断增加,内存管理成为了开发过程中的一个关键挑战。手动管理内存往往容易出现错误,例如忘记释放已经不再使用的内存或者释放尚未被使用的内存,这将导致内存泄漏或者无效的内存访问。垃圾回收器通过监测和回收不再使用的内存,帮助我们解决了这些问题,使得我们能够更专注于程序的逻辑实现,而不必过多关注内存管理细节。

目录

前言:

垃圾回收器:

新生代垃圾回收器:

Serial(串行)垃圾回收器:

ParNew(并行新生代)垃圾回收器:

Parallel Scavenge(并行回收)垃圾回收器:

老年代垃圾回收器:

Serial Old(串行老年代)垃圾回收器:

CMS(Concurrent Mark-Sweep)垃圾回收器:

G1(Garbage-First)垃圾回收器:

总结:


 

垃圾回收器:

新生代垃圾回收器:

Serial(串行)垃圾回收器

回收年代和算法:

Serial垃圾回收器属于新生代的垃圾回收器,在新生代使用复制算法进行垃圾回收。在新生代中,对象主要分为Eden区、Survivor区From和Survivor区To。Serial垃圾回收器会将Eden区和From Survivor区中存活的对象复制到To Survivor区,同时清空Eden区和From Survivor区。在多次复制后仍存活的对象会被晋升到老年代,而老年代的垃圾回收则使用标记-整理算法。

优点:

  1. 简单高效:Serial垃圾回收器采用单线程执行垃圾回收操作,实现简单且高效。
  2. 资源消耗低:由于是单线程执行,因此对系统资源的占用较少,在某些资源受限的环境下表现良好。
  3. 适用于单核CPU:在单核CPU上,Serial垃圾回收器可以充分发挥其优势。

缺点:

  1. 停顿时间长:由于是单线程执行,垃圾回收过程可能会导致较长的停顿时间,影响应用程序的响应性能。
  2. 不适用于多核CPU:在多核CPU上,由于无法充分利用多核处理器的优势,性能表现不如并行或并发的垃圾回收器。

适用场景:

  1. 客户端应用:适用于客户端应用,例如桌面应用、移动应用等,对系统资源要求不高,能够提供稳定的垃圾回收性能。
  2. 小型服务器:适用于小规模的服务器应用,对系统资源要求不高,能够提供稳定的垃圾回收性能。

总之,Serial垃圾回收器适用于对系统资源要求不高、对停顿时间要求不敏感的场景,但不适合大型应用程序或高并发场景。

ParNew(并行新生代)垃圾回收器

回收年代和算法:

ParNew(并行新生代)垃圾回收器同样属于新生代的垃圾回收器,在新生代使用复制算法进行垃圾回收。它是Serial垃圾回收器的多线程版本,主要用于多核CPU环境下。ParNew垃圾回收器仍然将新生代分为Eden区和Survivor区,采用多线程并行方式进行垃圾回收操作,提高了回收效率。

优点:

  1. 多线程执行:ParNew垃圾回收器采用多线程并行方式进行垃圾回收操作,能够充分利用多核CPU的优势,提高垃圾回收效率。
  2. 低停顿时间:相比于Serial垃圾回收器,ParNew在执行垃圾回收操作时能够显著降低停顿时间,减少对应用程序的影响。

缺点:

  1. 资源消耗较大:由于采用多线程并行执行,可能会占用较多的系统资源。
  2. 不适用于单核CPU:在单核CPU上,ParNew垃圾回收器无法发挥其多线程并行的优势,性能表现可能不如Serial垃圾回收器。

适用场景:

  1. 中小型服务器:适用于中小规模的服务器应用,对系统资源要求不是很严格,但需要更好的垃圾回收性能。
  2. 对停顿时间要求较高的应用:对于需要较低停顿时间的应用,ParNew垃圾回收器能够提供更好的性能表现。

总之,ParNew垃圾回收器适用于对系统资源要求不是很严格,但对垃圾回收性能有一定要求的场景,特别是在多核CPU环境下能够充分发挥其优势。

Parallel Scavenge(并行回收)垃圾回收器

回收年代和算法:

Parallel Scavenge(并行回收)垃圾回收器是一种主要用于新生代的垃圾回收器,使用复制算法进行垃圾回收。与ParNew不同的是,Parallel Scavenge注重吞吐量优化,通过并行执行垃圾回收操作来提高整体应用程序的吞吐量。

优点:

  1. 高吞吐量:Parallel Scavenge垃圾回收器注重吞吐量优化,通过并行执行垃圾回收操作,能够提高整体应用程序的吞吐量。
  2. 减少停顿时间:尽管并行执行垃圾回收操作,Parallel Scavenge仍然能够在可控范围内减少停顿时间,使得应用程序响应更加迅速。

缺点:

  1. 资源消耗较大:由于并行执行垃圾回收操作,Parallel Scavenge可能会占用较多的系统资源,对系统的负载有一定影响。
  2. 不适用于低延迟场景:由于注重吞吐量优化,Parallel Scavenge垃圾回收器的设计目标并不是最低延迟,对于低延迟场景的需求可能表现不佳。

适用场景:

  1. 数据处理应用:适用于需要高吞吐量、对延迟要求相对较宽松的数据处理应用,如批处理任务、数据分析等。
  2. 服务器应用:适用于大型服务器应用,能够提供高并发处理和良好的吞吐量,对停顿时间要求不是非常严格的场景。

总之,Parallel Scavenge垃圾回收器适用于对吞吐量要求较高、对延迟要求相对宽松的场景。它通过并行执行垃圾回收操作来提高整体应用程序的吞吐量,尽管会占用一定的系统资源,但在合适的应用场景下能够发挥较好的性能表现。

老年代垃圾回收器:

Serial Old(串行老年代)垃圾回收器

回收年代和算法:

Serial Old(串行老年代)垃圾回收器是一种用于老年代的垃圾回收器,采用标记-整理算法进行垃圾回收。它是串行垃圾回收器的老年代版本,主要用于单线程环境下。

优点:

  1. 简单高效:Serial Old垃圾回收器采用串行方式执行垃圾回收操作,相比并行和并发垃圾回收器,它的实现较为简单,消耗的系统资源较少。
  2. 低停顿时间:由于是单线程执行,Serial Old垃圾回收器能够在垃圾回收过程中暂停应用程序的时间较短,对应用程序的影响较小。

缺点:

  1. 性能限制:由于采用串行方式执行垃圾回收操作,Serial Old垃圾回收器无法充分利用多核CPU的优势,性能表现可能不如并行和并发垃圾回收器。
  2. 不适用于大型应用:对于大型应用和高并发场景,Serial Old垃圾回收器可能无法满足性能要求,因为它是单线程执行的,处理能力有限。

适用场景:

  1. 低资源消耗的场景:适用于对系统资源要求较低的场景,如小型应用、移动设备等。
  2. 单线程环境:适用于单线程环境下的应用程序,由于只有一个线程执行垃圾回收操作,不会导致多线程竞争和资源占用。

总之,Serial Old垃圾回收器适用于对系统资源要求较低,且在单线程环境下的应用程序。它的简单高效以及低停顿时间的特点使得它适合于一些小型应用和低并发场景。但对于大型应用和高并发场景,可能需要考虑使用更为高级的并行或并发垃圾回收器来提高性能。

CMS(Concurrent Mark-Sweep)垃圾回收器

回收年代和算法:

CMS(Concurrent Mark-Sweep)垃圾回收器是一种用于老年代的并发标记-清除算法垃圾回收器。它的主要目标是减少应用程序的停顿时间,通过并发执行部分垃圾回收操作来实现。

优点:

  1. 低停顿时间:CMS垃圾回收器采用并发执行的方式,在垃圾回收过程中会与应用程序的执行同时进行,尽量减少对应用程序的停顿时间。
  2. 短暂的回收阶段:CMS垃圾回收器的标记和清除阶段尽可能地短暂,以减少对应用程序的影响。
  3. 高并发性:由于并发执行,CMS垃圾回收器能够充分利用多核CPU的优势,提供较高的吞吐量。

缺点:

  1. 需要更多的系统资源:由于并发执行垃圾回收操作,CMS垃圾回收器需要额外的系统资源支持,并且在回收过程中会产生一定的内存碎片。
  2. CPU资源抢占:由于并发执行,CMS垃圾回收器会占用一部分CPU资源,可能会对应用程序的执行性能产生一定影响。
  3. 存在退化问题:如果老年代内存不足无法分配对象,CMS就会退化成为Serial Old单线程回收老年代。

适用场景:

  1. 对低停顿时间要求较高的应用:CMS垃圾回收器适用于对低停顿时间有较高要求的应用程序,如实时性要求较高的系统、Web服务器等。
  2. 多核CPU环境:由于能够充分利用多核CPU的并发性能,CMS垃圾回收器适用于运行在多核环境下的应用程序。

总之,CMS垃圾回收器适用于对停顿时间要求较低的应用程序,并且能够在多核CPU环境下提供较高的吞吐量。它通过并发执行部分垃圾回收操作来减少停顿时间,但也需要更多的系统资源支持。在选择垃圾回收器时,应根据具体应用场景和性能需求进行评估和选择。

G1(Garbage-First)垃圾回收器

回收年代和算法:

G1(Garbage-First)垃圾回收器是一种面向堆内存整体管理的并发标记-整理算法垃圾回收器。它将堆内存划分为多个大小相等的区域(Region),并采用不同的算法对每个区域进行垃圾回收,从JDK9之后的默认垃圾回收器就是G1。

Paraller Scavenge 关注吞吐量,CMS关注暂停时间。

而G1把这两个垃圾回收器的优点进行了融合。 

优点:

  1. 低停顿时间:G1垃圾回收器采用并发执行的方式,在垃圾回收过程中会与应用程序的执行同时进行,尽量减少对应用程序的停顿时间。
  2. 高效的内存整理:由于采用标记-整理算法,G1垃圾回收器能够高效地进行内存整理,减少内存碎片,提高内存利用率。
  3. 精确控制回收时间:G1垃圾回收器能够根据实际情况动态调整回收时间和区域大小,以更精确地控制垃圾回收过程,减少对应用程序的影响。
  4. 允许多CPU并行垃圾执行:G1垃圾回收器允许多CPU并行垃圾回收,大大提高了垃圾回收效率。

缺点:

  1. 需要更多的系统资源:由于需要维护区域的信息和状态,G1垃圾回收器需要额外的系统资源支持,并且在回收过程中会产生一定的内存碎片。
  2. 较慢的回收速度:由于需要维护区域的信息和状态,G1垃圾回收器的回收速度可能相对较慢。

适用场景:

  1. 高吞吐量、低停顿时间要求的应用:G1垃圾回收器适用于对高吞吐量、低停顿时间有较高要求的应用程序,如在线交易系统、金融交易系统等。
  2. 大型应用程序:由于能够精确控制回收时间和区域大小,G1垃圾回收器适用于大型应用程序。

总之,G1垃圾回收器适用于对吞吐量和低停顿时间有较高要求的应用程序,并且能够精确控制回收时间和区域大小。它通过将堆内存划分为多个区域,采用不同的算法对每个区域进行垃圾回收,以提高垃圾回收效率和内存利用率。在选择垃圾回收器时,应根据具体应用场景和性能需求进行评估和选择。

由于垃圾回收器分为年轻代和老年代,因此除了G1之外的其他垃圾回收器必须组合使用。

 需要注意的是,G1将堆划分为了多个大小相等的区域,称为是区Region,区域不要求是连续的。

而Region Size 必须是2 的指数幂,范围从1M到32M。 

总结:

本文介绍了几种常见的垃圾回收器以及它们的工作原理。我们探讨了串行、并行、CMS和G1垃圾回收器,并指出了它们各自的优缺点和适用场景。同时,我们也强调了选择垃圾回收器组合的重要性,需要根据应用程序的特性、硬件环境和性能需求等因素进行灵活选择,以提供最优的性能和用户体验。通过合理的选择和优化,我们能够为应用程序提供更好的内存管理和垃圾回收性能。

如果我的内容对你有帮助,请点赞,评论,收藏创作不易,大家的支持就是我坚持下去的动力!

 

 

 

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

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

相关文章

基于pandoraNext使用chatgpt4

1.登陆GitHub 获取pandoraNext项目GitHub - pandora-next/deploy: Pandora Cloud Pandora Server Shared Chat BackendAPI Proxy Chat2API Signup Free PandoraNext. New GPTs(Gizmo) UI, All in one! 在release中选择相应版本操作系统的安装包进行下载 2.获取license_…

【OS】操作系统总复习笔记

操作系统总复习 文章目录 操作系统总复习一、考试题型1. 论述分析题2. 计算题3. 应用题 二、操作系统引论(第1章)2.1 操作系统的发展过程2.2 操作系统定义2.3 操作系统的基本特性2.3.1 并发2.3.2 共享2.3.3 虚拟2.3.4 异步 2.4 OS的功能2.5 OS结构2.5 习…

聊聊Java中的常用类String

String、StringBuffer、StringBuilder 的区别 从可变性分析 String不可变。StringBuffer、StringBuilder都继承自AbstractStringBuilder ,两者的底层的数组value并没有使用private和final修饰,所以是可变的。 AbstractStringBuilder 源码如下所示 ab…

鸿蒙ArkTS Web组件加载空白的问题原因及解决方案

问题症状 初学鸿蒙开发,按照官方文档Web组件文档《使用Web组件加载页面》示例中的代码照抄运行后显示空白,纠结之余多方搜索后扔无解决方法。 运行代码 import web_webview from ohos.web.webviewEntry Component struct Index {controller: web_webv…

MuMu模拟器12如何连接adb?

一、MuMu模拟器12端口查看 MuMu模拟器12现已支持adb同时连接多个模拟器进行调试的操作,可以参考以下步骤操作,查看MuMu模拟器12本体以及多开模拟器的adb端口: 单开的MUMU模拟器12可通过模拟器右上角菜单-问题诊断,获取ADB调试端…

VM-Linux 桥接网络设置

VM-Linux 桥接网络设置 文章目录 VM-Linux 桥接网络设置什么是桥接网络环境工具关键配置VM设置CentOS7配置 什么是桥接网络 网络桥接是将两个或多个独立的网络进行连接的一种方法。它可以把两个网络的数据传输机制集成在一起,使得用户可以更顺畅地访问各个网络&…

Linux实操——安装Mysql

安装Mysql 一、检查是否已经安装了mariadb数据库,并卸载二、下载mysql包,并通过ftp上传到服务器三、解压安装包四、创建数据存储文件夹五、创建执行mysqld命令的用户,并初始化mysql六、启用传输安全七、启动mysql,验证是否安装成功 总结 博主…

stm32F407-GPIO的使用——点亮LED并且讲解各个寄存器

stm32F407-GPIO的使用——点亮LED并且讲解各个寄存器 本文为stm32GPIO的介绍与使用,例子是简单的LED点亮。 一、 GPIO GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,通俗地说, 就是一些引脚,可…

数据结构第六课 -------迭代排序(快速排序和归并排序)

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

linux 调试工具 GDB 使用

gdb是linux下常用的代码调试工具,本文记录常用命令。 被调试的应用需要使用 -g 参数进行编译,如不确定可使用如下命令查看是否支持debug readelf -S filename | grep "debug" 启动调试 gdb binFile 例如要调试sshd: 调试带参数…

【淘宝网消费类电子产品销售数据可视化】

淘宝网消费类电子产品销售数据可视化 引言数据爬取与处理数据可视化系统功能1. 总数据量分析2. 店铺总数据3. 店铺销售额排名4. 不同电子商品销售价格5. 单个商品价格排名6. 不同省份平均销量7. 不同地区的平均销售额8. 省份数量9. 每个省份有用的平均个数 创新点结语 引言 随…

平头哥玄铁 E902 编译与使用

玄铁 E902 是平头哥半导体有限公司自主研发的极低功耗、极低成本嵌入式 CPU 核,以 8 位 CPU 的成本获得 32 位嵌入式 CPU 的运行效率与性能。 E902 兼容 RISC-V 指令架构,采用 16/32 位混合编码系统,指令系统与流水线硬件结构精简高效&#x…

单片机的低功耗模式介绍

文章目录 简介一、功耗来源说明1.1、芯片工作模式1.2、静态损耗1.3、I/O额外损耗1.4、动态损耗 二、功耗如何测量三、降低功耗有什么方法3.1、选取合适的芯片工作模式3.2、降低工作频率3.3、关闭不需要使用的外设3.4、 降低静态电流损耗3.5、 周期采集供电3.6、 设置IO口状态 四…

Visual Studio Code (Vscode)配置LaTeX

Visual Studio Code (Vscode)配置LaTeX 实操记录 第一步高效检索,找到官方的、靠谱的安装教程,最好多找几个,英文、中文教程都需要 LaTeX WorkshopInstallation and basic settingsHow to install LaTeX (with previews & autocomplete…

RK3568全国产化多网口板卡带poe供电,支持鸿蒙麒麟系统

信迈XM-3568-01主板采用瑞芯微RK3568四核Cortex-A55 处理器,主频最高可达2.0GHz,效能有大幅提升最高可配8GB内存容量,频率高达1600MHz;支持全链路ECC,让数据更安全可靠配置双千兆自适应RJ45以太网口,并扩展…

ArkTS的状态管理机制(State)

什么是ArkTS的状态管理机制 声明式UI中,是以状态(State)来驱动视图更新的(View)。 状态是指驱动视图更新的数据(被装饰器标记的变量)。 视图是指UI描述渲染得到的用户页面。 互动事件可以改变状态的值。状态改变以后,又会触发事件,渲染页面。…

电子取证中Chrome各版本解密Cookies、LoginData账号密码、历史记录

文章目录 1.前置知识点2.对于80.X以前版本的解密拿masterkey的几种方法方法一 直接在目标机器运行Mimikatz提取方法二 转储lsass.exe 进程从内存提取masterkey方法三 导出SAM注册表 提取user hash 解密masterkey文件(有点麻烦不太推荐)方法四 已知用户密…

QT作业4

实现一个闹钟&#xff0c;当输入时间后&#xff0c;点击启动到达时间后循环播报三遍&#xff0c;便签内容 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTextToSpeech> //文本转语言类 #include <QTimerEvent> //定…

国产数据库适配-达梦(DM)

1、通用性 达梦数据库管理系统兼容多种硬件体系&#xff0c;可运行于X86、X64、SPARC、POWER等硬件体系之上。DM各种平台上的数据存储结构和消息通信结构完全一致&#xff0c;使得DM各种组件在不同的硬件平台上具有一致的使用特性。 达梦数据库管理系统产品实现了平台无关性&…

机器视觉系统选型-线光源分类及应用场景

标准线光源 从线性LED的发光面照射漫射光 玻璃划痕检测印刷字符检测手机屏幕检测PCB板检测 高亮线光源 从线性LED的发光面照射高亮度漫射光高速流水线检测表面印刷检测表面缺陷检测 集光型线光源 从线性LED的发光面照射直射光划痕缺陷检测印刷字符检测布料检测 同轴线光源 与相…