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

news2024/11/23 13:02:05

前言:

垃圾回收器(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垃圾回收器,并指出了它们各自的优缺点和适用场景。同时,我们也强调了选择垃圾回收器组合的重要性,需要根据应用程序的特性、硬件环境和性能需求等因素进行灵活选择,以提供最优的性能和用户体验。通过合理的选择和优化,我们能够为应用程序提供更好的内存管理和垃圾回收性能。

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

 

 

 

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

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

相关文章

MetaAI发布Seamless:两秒内实现跨语言同声传译

在当今日益互联的世界中,语言差异常常成为沟通的障碍。MetaAI最新发布的语音翻译大模型Seamless,正是为打破这一障碍而生。Seamless不仅提供流畅、高效的多语言翻译功能,更在保留说话人韵律和风格方面取得突破,是AI同声传译领域的…

Python开源项目周排行 2023年第40周

Python 趋势周报,按周浏览往期 GitHub,Gitee 等最热门的Python开源项目,入选的项目主要参考GitHub Trending,部分参考了Gitee和其他。排名不分先后,都是当周相对热门的项目。 入选公式=70%GitHub Trending20%Gitee10%其他 关注微…

Tekton 构建容器镜像

Tekton 构建容器镜像 介绍如何使用 Tektonhub 官方 kaniko task 构建docker镜像,并推送到远程dockerhub镜像仓库。 kaniko task yaml文件下载地址:https://hub.tekton.dev/tekton/task/kaniko 查看kaniko task yaml内容: 点击Install&…

QQ邮箱发送工具类的实现

我们在日常开发中&#xff0c;需要实现一个对邮箱的发送&#xff0c;今天就实现邮箱的发送工具类&#xff0c;只需要一些注册邮箱之后的配置即可&#xff0c;我这边使用的是qq邮箱 0.加上依赖 <!--邮箱--><dependency><groupId>org.springframework.boot&l…

Docker单机部署OceanBase

文章目录 说明机器软硬件要求指导文档本次部署环境说明 OceanBase单机部署&#xff08;Docker&#xff09;一&#xff1a;拉取 OceanBase 数据库相关镜像二&#xff1a;启动 OceanBase 数据库实例完整启动日志展示 三&#xff1a;连接实例遇到报错&#xff1a;没有mysql客户端 …

【lesson14】MySQL表的基本查询retrieve(读取)1

文章目录 表的基本操作介绍retrieveselect列建表基本测试 where子句建表基本测试 表的基本操作介绍 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; retrieve select列 建表 基本测试 插入数据 全列查询 …

GoogLeNet(pytorch)

亮点与创新&#xff1a; 1. 引入Inception基础结构 2. 引入PW维度变换卷积&#xff0c;启迪后续参数量的优化 3. 丢弃全连接层&#xff0c;使用平均池化层&#xff08;大大减少模型参数&#xff09; 4. 添加两个辅助分类器帮助训练&#xff08;避免梯度消失&#xff0c;用于…

智能电气柜环境监测系统

智能电气柜环境监控系统是一种基于传感器技术和物联网技术的智能化监控系统&#xff0c;用于对电气柜内的环境参数进行实时监测和管理。依托智慧电力运维工具-电易云&#xff0c;通过安装在电气柜内的多个传感器&#xff0c;实时采集电气柜内的温度、湿度、氧气浓度、烟雾等关键…

windows redis 允许远程访问配置

安装好windows版本的redis&#xff0c;会以服务方式启动&#xff0c;但是不能远程访问&#xff0c;这个时候需要修改配置。redis安装路径下会有2个配置文件&#xff0c;究竟需要怎么修改才能生效呢&#xff1f;看下图 这里的redis服务指定了是redis.windows-service.conf文件&…

java_web_电商项目

java_web_电商项目 1.登录界面2.注册界面3. 主界面4.分页界面5.商品详情界面6. 购物车界面7.确认订单界面8.个人中心界面9.收货地址界面10.用户信息界面11.用户余额充值界面12.后台首页13.后台商品增加14.后台用户增加15.用户管理16.源码分享1.登录页面的源码2.我们的主界面 1.…

Xml与Json格式在线转换器

具体请前往&#xff1a;在线Json转Form表单参数工具

计算机网络(四)

九、网络安全 &#xff08;一&#xff09;什么是网络安全&#xff1f; A、网络安全状况 分布式反射攻击逐渐成为拒绝攻击的重要形式 涉及重要行业和政府部门的高危漏洞事件增多。 基础应用和通用软硬件漏洞风险凸显&#xff08;“心脏出血”&#xff0c;“破壳”等&#x…

springMVC-@RequestMapping

基本介绍 RequestMapping注解可以指定控制器/处理器的某个方法的请求的url, 示例 &#xff08;结合springMVC基本原理理解&#xff09; Controller public class UserHandler {RequestMapping(value "/login")public String login() {System.out.println("登…

JOSEF约瑟 静态双位置继电器 DPR-35 DC110V柜内固定安装,板前接线

系列型号&#xff1a; DPR-20双位置继电器&#xff1b;DPR-31双位置继电器&#xff1b; DPR-32双位置继电器&#xff1b;DPR-33双位置继电器&#xff1b; DPR-34双位置继电器&#xff1b;DPR-35双位置继电器&#xff1b; DPR-11双位置继电器&#xff1b;DPR-12双位置继电器…

【数据结构和算法】--队列的特殊结构-循环队列

目录 循环队列的结构循环队列的实现循环队列的创建循环队列为空判断循环队列为满判断入队出队返回循环队列首元素返回循环队列尾元素释放循环队列 循环队列的结构 循环队列是队列的一种特殊结构&#xff0c;它的长度是固定的k&#xff0c;同样是先进先出&#xff0c;理论结构是…

飞天使-docker知识点6-容器dockerfile各项名词解释

文章目录 docker的小技巧dockerfile容器为什么会出现启动了不暂停查看docker 网桥相关信息 docker 数据卷 docker的小技巧 [rootlight-test playbook-vars[]# docker inspect -f "{{.NetworkSettings.IPAddress}}" d3a9ae03ae5f 172.17.0.4docker d3a9ae03ae5f:/etc…

RK3399平台开发系列讲解(内核入门篇)什么是函数调用栈

🚀返回专栏总目录 文章目录 一、什么是函数调用栈二、函数调用栈解析三、什么是stack overflow沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在开发软件的过程中我们经常会遇到错误,如果你用 Google 搜过出错信息,那你多少应该都访问过Stack Overflow这个网站。作…

三、JS逆向

一、JS逆向 解释&#xff1a;在我们爬虫的过程中经常会遇到参数被加密的情况&#xff0c;这样只有先在前端搞清楚加密参数是怎么生成的才能继续我们的爬虫&#xff0c;而且此时我们还需要用python去执行这个加密的过程。本文主要讲怎么在浏览器调试JS&#xff0c;以及Python执…

网络(七)路由协议以及相关配置

目录 一、路由器的工作原理 二、路由表的形成 2.1 直连网段 2.2 非直连网 2.3 路由表解析 2.3.1 查看路由表 2.3.2 解析 三、静态路由和默认路由 1. 静态路由 1.1 定义 1.2 特点 2. 默认路由 2.1 定义 2.2 特点 四、静态路由和默认路由的配置 1. 静态路由配置…

很抱歉,Midjourney,但Leonardo AI的图像指导暂时还无人能及…至少目前是这样

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…