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

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

 

 

 

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

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

相关文章

selenium+python自动化测试 —— 解决无法启动IE浏览器及报错问题!

前言:记录启动IE浏览器的报错及解决方法。 错误1: selenium.common.exceptions.WebDriverException: Message: IEDriverServer.exe executable needs to be in PATH. Please download from http://selenium-release.storage.googleapis.com/index.html…

【C语言:动态内存管理】

文章目录 前言1.malloc2.free3.calloc4.realloc5.动态内存常见错误6.动态内存经典笔试题分析7.柔性数组8.C/C中的内存区域划分 前言 文章的标题是动态内存管理,那什么是动态内存管理?为什么有动态内存管理呢? 回顾一下以前学的知识&#xff…

SpringBoot+Vue3前后端快速整合入门

前言 最近需要维护一个个人项目,由于笔者是一个大后端,所以借此机会把前端学习过程记录一下,方便后续回顾。 前端项目初始化 安装npm 在前端项目初始化时,我们必须要安装好node,官网地址如下,因为笔者后…

1.【Multisim仿真】数电模电学习,仿真软件的初步使用

学习计划路径: >Multisim电路仿真软件熟练掌握 >数字电路基础课程 >逻辑电路设计与应用 >熟练掌握存储器、脉冲波形发生器、D/A和A/D转换器原理 >基本元器件熟练掌握 >晶体管放大电路及负反馈放大电路 >集成运算放大器设计 >电压变电流电路…

解决GateWay报错:Exceeded limit on max bytes to buffer : 262144

场景: 前端传来了一个大的字符串 发现请求不通 一番调试发现SpringGateway 默认内存缓冲区262144字节 网上查了很多种常见的解决方案无效之后 直接重写底层 网友的解决方案 方案1(无效) 直接修改缓冲区大小 spring:codec:max-in-memory-s…

【STM32】STM32学习笔记-LED闪烁 LED流水灯 蜂鸣器(06-2)

00. 目录 文章目录 00. 目录01. GPIO之LED电路图02. GPIO之LED接线图03. LED闪烁程序示例04. LED闪烁程序下载05. LED流水灯接线图06. LED流水灯程序示例07. 蜂鸣器接线图08. 蜂鸣器程序示例09. 下载10. 附录 01. GPIO之LED电路图 电路图示例1 电路图示例2 02. GPIO之LED接线图…

持续集成交付CICD:Jenkins使用GitLab共享库实现自动上传前后端项目Nexus制品

目录 一、实验 1.GitLab本地导入前后端项目 2.Jenkins新建前后端项目流水线 3.Sonarqube录入质量阈与质量配置 4.修改GitLab共享库代码 5.Jenkins手动构建前后端项目流水线 6.Nexus查看制品上传情况 7.优化代码获取RELEASE分支 8.优化Jenkins流水线项目名称 一、实验 …

计算机网络:数据链路层(网桥)

带你速通计算机网络期末 目录 一、冲突域和广播域 二、网桥介绍 三、网桥分类—―透明网桥 四、网桥分类―—源路由网桥 五、多接口网桥―—以太网交换机 总结 一、冲突域和广播域 冲突域:在同一个冲突域中的每一个节点都能收到所有被发送的帧。简单的说就是同一时间内只…

华为数通---配置基本QinQ示例

QinQ简介 定义 QinQ(802.1Q-in-802.1Q)技术是一项扩展VLAN空间的技术,通过在802.1Q标签报文的基础上再增加一层802.1Q的Tag来达到扩展VLAN空间的功能,可以使私网VLAN透传公网。由于在骨干网中传递的报文有两层802.1Q Tag&#x…

MySQL之DQL语句

DQL语句 DQL(Data Query Language)查询数据 操作查询:select简单的查询,复杂的查询数据库中最核心的语言,最重要的语句使用频繁的语句 指定查询 查询全部 语法: select 全部字段(*&#x…

什么是tomcat?tomcat是干什么用的?

目录 Tomcat 的主要用途包括: 托管Java Web应用程序: Servlet 容器: 以下是关于Servlet容器的一些关键特性和功能: 生命周期管理: 多线程支持: HTTP请求处理: HTTP响应生成:…

金融众筹系统源码:适合创业孵化机构 附带完整的搭建教程

互联网技术的发展,金融众筹作为一种新型的融资方式,逐渐成为创业孵化机构的重要手段。为了满足这一需求,金融众筹系统源码就由此而生,并附带了完整的搭建教程。 以下是部分代码示例: 系统特色功能一览: 1.…

《从入门到精通:AJAX基础知识解析,前端开发中利器》基础篇

目录 学习目标: 学习目录: 学习时间: 学习内容: 什么是 AJAX? 怎么用 AJAX ? 认识 URL 协议 域名 资源路径 获取 - 新闻列表 URL 查询参数 axios-查询参数 常用请求方法和数据提…

Jenkins离线安装部署教程简记

前言 在上一篇文章基于Gitee实现Jenkins自动化部署SpringBoot项目中,我们了解了如何完成基于Jenkins实现自动化部署。 对于某些公司服务器来说,是不可以连接外网的,所以笔者专门整理了一篇文章总结一下,如何基于内网直接部署Jen…

ELADMIN - 免费开源 admin 后台管理系统,基于 Spring Boot 和 Vue ,包含前端和后端源码

一款简单好用、功能强大的 admin 管理系统,包含前端和后端源码,分享给大家。 ELADMIN 是一款基于 Spring Boot、Jpa 或 Mybatis-Plus、 Spring Security、Redis、Vue 的前后端分离的后台管理系统。 ELADMIN 的作者在 Github 和 Gitee 上看了很多的项目&…

Java项目学生管理系统六后端补充

班级管理 1 班级列表:后端 编写JavaBean【已有】编写Mapper【已有】编写Service编写controller 编写Service 接口 package com.czxy.service;import com.czxy.domain.Classes;import java.util.List;/*** author 桐叔* email liangtongitcast.cn* description*/ p…

【Jenkins】Centos环境安装Jenkins(通过rpm安装)

在Centos操作系统中通过rpm安装Jenkins 参考官网 https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos 1、下载安装Jdk17 下载安装 # 更新您的系统,不一定需要 # sudo yum -y update # 安装将用于下载 Java 17 二进制文件的 wget 命令行工具。 s…

计算机网络传输层(期末、考研)

计算机网络总复习链接🔗 目录 传输层的功能端口UDP协议UDP数据报UDP的首部格式UDP校验 TCP协议(必考)TCP报文段TCP连接的建立TCP连接的释放TCP的可靠传输TCP的流量控制零窗口探测报文段 TCP的拥塞控制慢开始和拥塞控制快重传和快恢复 TCP和U…

薅github的羊毛-用pages建自己的博客或静态资源站 - 1/2

注册帐号 准备邮箱注册帐号,在注册界面输入用户名、邮箱及密码完成注册。 添加图片注释,不超过 140 字(可选) 1. 在注册成过程中,会往邮箱发送验证码,请如实填写即可 2. 验证码没错的话,就代…

【Maven】加载 Maven 项目报错 status code: 501, reason phrase: HTTPS Required (501)

问题描述 加载 Maven 项目报错,错误信息如下: status code: 501, reason phrase: HTTPS Required (501)尝试使用 -U 标记(强制更新快照)运行 Maven 导入原因分析 这个错误通常表示 Maven 在尝试从远程仓库下载依赖时遇到了 HTTPS 必需的错误。 解决方…