【从零开始学习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区。在多次复制后仍存活的对象会被晋升到老年代,而老年代的垃圾回收则使用标记-整理算法。
优点:
- 简单高效:Serial垃圾回收器采用单线程执行垃圾回收操作,实现简单且高效。
- 资源消耗低:由于是单线程执行,因此对系统资源的占用较少,在某些资源受限的环境下表现良好。
- 适用于单核CPU:在单核CPU上,Serial垃圾回收器可以充分发挥其优势。
缺点:
- 停顿时间长:由于是单线程执行,垃圾回收过程可能会导致较长的停顿时间,影响应用程序的响应性能。
- 不适用于多核CPU:在多核CPU上,由于无法充分利用多核处理器的优势,性能表现不如并行或并发的垃圾回收器。
适用场景:
- 客户端应用:适用于客户端应用,例如桌面应用、移动应用等,对系统资源要求不高,能够提供稳定的垃圾回收性能。
- 小型服务器:适用于小规模的服务器应用,对系统资源要求不高,能够提供稳定的垃圾回收性能。
总之,Serial垃圾回收器适用于对系统资源要求不高、对停顿时间要求不敏感的场景,但不适合大型应用程序或高并发场景。
ParNew(并行新生代)垃圾回收器:
回收年代和算法:
ParNew(并行新生代)垃圾回收器同样属于新生代的垃圾回收器,在新生代使用复制算法进行垃圾回收。它是Serial垃圾回收器的多线程版本,主要用于多核CPU环境下。ParNew垃圾回收器仍然将新生代分为Eden区和Survivor区,采用多线程并行方式进行垃圾回收操作,提高了回收效率。
优点:
- 多线程执行:ParNew垃圾回收器采用多线程并行方式进行垃圾回收操作,能够充分利用多核CPU的优势,提高垃圾回收效率。
- 低停顿时间:相比于Serial垃圾回收器,ParNew在执行垃圾回收操作时能够显著降低停顿时间,减少对应用程序的影响。
缺点:
- 资源消耗较大:由于采用多线程并行执行,可能会占用较多的系统资源。
- 不适用于单核CPU:在单核CPU上,ParNew垃圾回收器无法发挥其多线程并行的优势,性能表现可能不如Serial垃圾回收器。
适用场景:
- 中小型服务器:适用于中小规模的服务器应用,对系统资源要求不是很严格,但需要更好的垃圾回收性能。
- 对停顿时间要求较高的应用:对于需要较低停顿时间的应用,ParNew垃圾回收器能够提供更好的性能表现。
总之,ParNew垃圾回收器适用于对系统资源要求不是很严格,但对垃圾回收性能有一定要求的场景,特别是在多核CPU环境下能够充分发挥其优势。
Parallel Scavenge(并行回收)垃圾回收器:
回收年代和算法:
Parallel Scavenge(并行回收)垃圾回收器是一种主要用于新生代的垃圾回收器,使用复制算法进行垃圾回收。与ParNew不同的是,Parallel Scavenge注重吞吐量优化,通过并行执行垃圾回收操作来提高整体应用程序的吞吐量。
优点:
- 高吞吐量:Parallel Scavenge垃圾回收器注重吞吐量优化,通过并行执行垃圾回收操作,能够提高整体应用程序的吞吐量。
- 减少停顿时间:尽管并行执行垃圾回收操作,Parallel Scavenge仍然能够在可控范围内减少停顿时间,使得应用程序响应更加迅速。
缺点:
- 资源消耗较大:由于并行执行垃圾回收操作,Parallel Scavenge可能会占用较多的系统资源,对系统的负载有一定影响。
- 不适用于低延迟场景:由于注重吞吐量优化,Parallel Scavenge垃圾回收器的设计目标并不是最低延迟,对于低延迟场景的需求可能表现不佳。
适用场景:
- 数据处理应用:适用于需要高吞吐量、对延迟要求相对较宽松的数据处理应用,如批处理任务、数据分析等。
- 服务器应用:适用于大型服务器应用,能够提供高并发处理和良好的吞吐量,对停顿时间要求不是非常严格的场景。
总之,Parallel Scavenge垃圾回收器适用于对吞吐量要求较高、对延迟要求相对宽松的场景。它通过并行执行垃圾回收操作来提高整体应用程序的吞吐量,尽管会占用一定的系统资源,但在合适的应用场景下能够发挥较好的性能表现。
老年代垃圾回收器:
Serial Old(串行老年代)垃圾回收器:
回收年代和算法:
Serial Old(串行老年代)垃圾回收器是一种用于老年代的垃圾回收器,采用标记-整理算法进行垃圾回收。它是串行垃圾回收器的老年代版本,主要用于单线程环境下。
优点:
- 简单高效:Serial Old垃圾回收器采用串行方式执行垃圾回收操作,相比并行和并发垃圾回收器,它的实现较为简单,消耗的系统资源较少。
- 低停顿时间:由于是单线程执行,Serial Old垃圾回收器能够在垃圾回收过程中暂停应用程序的时间较短,对应用程序的影响较小。
缺点:
- 性能限制:由于采用串行方式执行垃圾回收操作,Serial Old垃圾回收器无法充分利用多核CPU的优势,性能表现可能不如并行和并发垃圾回收器。
- 不适用于大型应用:对于大型应用和高并发场景,Serial Old垃圾回收器可能无法满足性能要求,因为它是单线程执行的,处理能力有限。
适用场景:
- 低资源消耗的场景:适用于对系统资源要求较低的场景,如小型应用、移动设备等。
- 单线程环境:适用于单线程环境下的应用程序,由于只有一个线程执行垃圾回收操作,不会导致多线程竞争和资源占用。
总之,Serial Old垃圾回收器适用于对系统资源要求较低,且在单线程环境下的应用程序。它的简单高效以及低停顿时间的特点使得它适合于一些小型应用和低并发场景。但对于大型应用和高并发场景,可能需要考虑使用更为高级的并行或并发垃圾回收器来提高性能。
CMS(Concurrent Mark-Sweep)垃圾回收器:
回收年代和算法:
CMS(Concurrent Mark-Sweep)垃圾回收器是一种用于老年代的并发标记-清除算法垃圾回收器。它的主要目标是减少应用程序的停顿时间,通过并发执行部分垃圾回收操作来实现。
优点:
- 低停顿时间:CMS垃圾回收器采用并发执行的方式,在垃圾回收过程中会与应用程序的执行同时进行,尽量减少对应用程序的停顿时间。
- 短暂的回收阶段:CMS垃圾回收器的标记和清除阶段尽可能地短暂,以减少对应用程序的影响。
- 高并发性:由于并发执行,CMS垃圾回收器能够充分利用多核CPU的优势,提供较高的吞吐量。
缺点:
- 需要更多的系统资源:由于并发执行垃圾回收操作,CMS垃圾回收器需要额外的系统资源支持,并且在回收过程中会产生一定的内存碎片。
- CPU资源抢占:由于并发执行,CMS垃圾回收器会占用一部分CPU资源,可能会对应用程序的执行性能产生一定影响。
- 存在退化问题:如果老年代内存不足无法分配对象,CMS就会退化成为Serial Old单线程回收老年代。
适用场景:
- 对低停顿时间要求较高的应用:CMS垃圾回收器适用于对低停顿时间有较高要求的应用程序,如实时性要求较高的系统、Web服务器等。
- 多核CPU环境:由于能够充分利用多核CPU的并发性能,CMS垃圾回收器适用于运行在多核环境下的应用程序。
总之,CMS垃圾回收器适用于对停顿时间要求较低的应用程序,并且能够在多核CPU环境下提供较高的吞吐量。它通过并发执行部分垃圾回收操作来减少停顿时间,但也需要更多的系统资源支持。在选择垃圾回收器时,应根据具体应用场景和性能需求进行评估和选择。
G1(Garbage-First)垃圾回收器:
回收年代和算法:
G1(Garbage-First)垃圾回收器是一种面向堆内存整体管理的并发标记-整理算法垃圾回收器。它将堆内存划分为多个大小相等的区域(Region),并采用不同的算法对每个区域进行垃圾回收,从JDK9之后的默认垃圾回收器就是G1。
Paraller Scavenge 关注吞吐量,CMS关注暂停时间。
而G1把这两个垃圾回收器的优点进行了融合。
优点:
- 低停顿时间:G1垃圾回收器采用并发执行的方式,在垃圾回收过程中会与应用程序的执行同时进行,尽量减少对应用程序的停顿时间。
- 高效的内存整理:由于采用标记-整理算法,G1垃圾回收器能够高效地进行内存整理,减少内存碎片,提高内存利用率。
- 精确控制回收时间:G1垃圾回收器能够根据实际情况动态调整回收时间和区域大小,以更精确地控制垃圾回收过程,减少对应用程序的影响。
- 允许多CPU并行垃圾执行:G1垃圾回收器允许多CPU并行垃圾回收,大大提高了垃圾回收效率。
缺点:
- 需要更多的系统资源:由于需要维护区域的信息和状态,G1垃圾回收器需要额外的系统资源支持,并且在回收过程中会产生一定的内存碎片。
- 较慢的回收速度:由于需要维护区域的信息和状态,G1垃圾回收器的回收速度可能相对较慢。
适用场景:
- 高吞吐量、低停顿时间要求的应用:G1垃圾回收器适用于对高吞吐量、低停顿时间有较高要求的应用程序,如在线交易系统、金融交易系统等。
- 大型应用程序:由于能够精确控制回收时间和区域大小,G1垃圾回收器适用于大型应用程序。
总之,G1垃圾回收器适用于对吞吐量和低停顿时间有较高要求的应用程序,并且能够精确控制回收时间和区域大小。它通过将堆内存划分为多个区域,采用不同的算法对每个区域进行垃圾回收,以提高垃圾回收效率和内存利用率。在选择垃圾回收器时,应根据具体应用场景和性能需求进行评估和选择。
由于垃圾回收器分为年轻代和老年代,因此除了G1之外的其他垃圾回收器必须组合使用。
需要注意的是,G1将堆划分为了多个大小相等的区域,称为是区Region,区域不要求是连续的。
而Region Size 必须是2 的指数幂,范围从1M到32M。
总结:
本文介绍了几种常见的垃圾回收器以及它们的工作原理。我们探讨了串行、并行、CMS和G1垃圾回收器,并指出了它们各自的优缺点和适用场景。同时,我们也强调了选择垃圾回收器组合的重要性,需要根据应用程序的特性、硬件环境和性能需求等因素进行灵活选择,以提供最优的性能和用户体验。通过合理的选择和优化,我们能够为应用程序提供更好的内存管理和垃圾回收性能。
如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!
相关文章:

【从零开始学习JVM | 第九篇】了解 常见垃圾回收器
前言: 垃圾回收器(Garbage Collector)是现代编程语言中的一项重要技术,它提供了自动内存管理的机制,极大地简化了开发人员对内存分配和释放的繁琐工作。通过垃圾回收器,我们能够更高效地利用计算机的内存资…...

Wordle 游戏实现 - 使用 C++ Qt
标题:Wordle 游戏实现 - 使用 C Qt 摘要: Wordle 是一款文字猜词游戏,玩家需要根据给定的单词猜出正确的答案,并在限定的次数内完成。本文介绍了使用 C 和 Qt 框架实现 Wordle 游戏的基本思路和部分代码示例。 引言:…...

Python 爬虫开发完整环境部署,爬虫核心框架安装
Python 爬虫开发完整环境部署 前言: 关于本篇笔记,参考书籍为 《Python 爬虫开发实战3 》 笔记做出来的一方原因是为了自己对 Python 爬虫加深认知,一方面也想为大家解决在爬虫技术区的一些问题,本篇文章所使用的环境为&#x…...

汽车标定技术(十三)--标定概念再详解
目录 1.概述 2.基于Flash的标定 3.基于RAM的标定 4.AUTOSAR基于指针标定概念 5.小结 1.概述 最近有朋友问到是否用overlay标定完数据就直接写在Flash中,其实不然,是需要关闭overlay然后通过XCP Program指令集或者UDS刷进Flash。 从这里看出&#…...

PostgreSQL常用命令
数据库版本 :9.6.6 注意 :PostgreSQL中的不同类型的权限有 SELECT,INSERT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER,CREATE,CONNECT,TEMPORARY,EXECUTE 和 USAGE。 1. 登录PG数据库 以管理员身份 postgres 登陆,然后通过 #psql -U postgres #sudo -i -u postgres …...
使用python脚本部署k8s集群
1.环境规划: 节点IP地址操作系统配置脚本运行节点192.168.174.5centos7.92G2核server192.168.174.150centos7.92G2核client1192.168.174.151centos7.92G2核client2192.168.174.152centos7.92G2 2.运行准备: yum install -y python python-pip pip in…...

【C语言】操作符详解(四):结构成员访问操作符
目录 结构成员访问操作符 结构体 结构体的声明 结构体变量的定义和初始化 结构成员访问操作符 结构体成员的直接访问 结构体成员的间接访问 结构成员访问操作符 结构体 ⭐C语言已经提供了内置类型,如: char、short、int、long、float、double等,但…...

【算法】二分法
1、二分法 1.1 二分法原理 每次将查找的范围缩小一半,直到最后找到记录或者找不到记录返回。 要求:采用二分法查找时,数据需是排好序的。 1.2二分法思路 判断某个数是否在数组中存在(例:判断3是否在数组中存在&#…...
2023.12.18 JAVA学习day03,while与for循环
目录 0.switch 判断语句 一.for循环 1.简单练习 2.使用for循环计算1-100求和, 以及偶数求和 3.进阶练习,配合键盘录入与判断使用循环 二.while循环 三种格式的区别: 0.switch 判断语句 switch (表达式) { case 1: 语句体1; break; case …...

使用Pytorch从零开始构建StyleGAN2
这篇博文是关于 StyleGAN2 的,来自论文Analyzing and Improving the Image Quality of StyleGAN,我们将使用 PyTorch 对其进行干净、简单且可读的实现,并尝试尽可能地还原原始论文。 如果您没有阅读 StyleGAN2 论文。或者不知道它是如何工作…...

C++ Qt 开发:ListWidget列表框组件
Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍ListWidget列表框组件的常用方法及灵活运用。…...
手机天线市场分析:预计2029年将达到576亿美元
手机天线,即手机上用于接收信号的设备,旧式手机有外凸式天线,新式手机多数已隐藏在机身内。这类天线主要都在手机内部,手机外观上看不到里面的东西。 手机天线主要就内置及外置天线两种,内置天线客观上必然比外置天线弱…...

FPGA引脚分配的问题
今天在做一个FPGA的实验时,在引脚分配时失败了,出现了如下报错: 我当时分配的引脚是PIN_AE19,然而奇怪的是我之前并未分配这个引脚,我使用的开发工具是Quartus II 9.1 Web Edition,算个老版本了。 有的网站…...
面试经典150题(27-28)
leetcode 150道题 计划花两个月时候刷完,今天(第十三天)完成了2道(27-28)150: 今天这两道是真的汗流浃背!!! 27.(209. 长度最小的子数组)题目描述: 给定一…...

计算机图形学头歌合集(题集附解)
目录 CG1-v1.0-点和直线的绘制 第1关:OpenGL点的绘制 第2关:OpenGL简单图形绘制 第3关:OpenGL直线绘制 第4关:0<1直线绘制-dda算法<> 第5关:0<1直线绘制-中点算法<> 第6关:一般直线绘…...

MacBook Air提供了丰富多彩的截图选项,大到整个屏幕,小到具体的区域
本指南将带你了解在MacBook Air笔记本电脑上进行屏幕截图的各种方法。它涵盖了所有用于截屏的键盘快捷键,还包括如何启动MacBook Air屏幕录制和更改屏幕截图设置的信息。 如何在MacBook Air上进行屏幕截图 在MacBook上进行整个屏幕截图的最快、最简单的方法是使用command+sh…...

【CMU 15-445】Lecture 12: Query Execution I 学习笔记
Query Execution I Processing ModelsIterator ModelMaterialization ModelVectorization Model Access MethodsSequential ScanIndex Scan Modification QueriesHalloween Problem 本节课主要介绍SQL语句执行的相关机制。 Processing Models 首先是处理模型,它定义…...

低代码开发平台的优势及应用场景分析
文章目录 低代码是什么?低代码起源低代码分类低代码的能力低代码的需求市场需要专业开发者需要数字化转型需要 低代码的趋势如何快速入门低代码开发低代码应用领域 低代码是什么? 低代码(Low-code)是著名研究机构Forrester于2014…...
ES常见查询总结
目录 1:查询总数2:查询所有数据3:查询指定条数4:根据ID查询5:一个查询字符串搜索6:match搜索7:term搜索8:bool搜索9:must多条件匹配查询10:Should满足一个条件查询11: must_not必须不匹配查询12:多个字段查询内容13:一个字段查询多个内容14:通配符和正则匹配15:前缀查询16:短语…...
Spring Boot Docker Compose 支持中文文档
本文为官方文档直译版本。原文链接 Spring Boot Docker Compose 支持中文文档 引言服务连接自定义镜像跳过特定的容器使用特定Compose文件等待容器就绪控制 Docker Compose 的生命周期激活 Docker Compose 配置文件 引言 Docker Compose 是一种流行的技术,可用于为…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...

生信服务器 | 做生信为什么推荐使用Linux服务器?
原文链接:生信服务器 | 做生信为什么推荐使用Linux服务器? 一、 做生信为什么推荐使用服务器? 大家好,我是小杜。在做生信分析的同学,或是将接触学习生信分析的同学,<font style"color:rgb(53, 1…...