各种垃圾回收器简介

文章目录

  • 一、Serial垃圾回收器
  • 二、Parallel垃圾回收器
  • 三、CMS垃圾回收器
  • 四、G1垃圾回收器
    • 4.1 G1垃圾回收器的步骤
    • 4.2 根对象
    • 4.3 G1垃圾回收器常用参数
  • 五、ZGC垃圾回收器
  • 六、Epsilon垃圾回收器
  • 七、垃圾回收算法
    • 7.1 标记–清除算法
    • 7.2 复制算法
    • 7.3 标记–整理算法
    • 7.4 分代收集算法

垃圾回收器是Java虚拟机(JVM)中负责自动内存管理的组件,主要任务是回收不再使用的对象所占用的内存。JVM提供了多种垃圾回收器,每种都有其特点和适用场景。以下是几种常见的垃圾回收器及其执行步骤的介绍:

一、Serial垃圾回收器

Serial垃圾回收器是最基本的、历史最悠久的垃圾收集器。JDK1.3之前回收新生代唯一的选择。Serial垃圾回收器是一个单线程的收集器,它进行垃圾收集时必须暂停其他所有的工作线程,直到它收集结束。Serial 用于新生代回收,采用复制算法;Serial Old 用于老年代回收,采用标记-整理算法。
Serial 一般用在客户端程序或占用内存较小的微服务,因为客户端程序一般分配的内存都比较小,可能几十兆或一两百兆,回收时的停顿时间是完全可以接受的。而且 Serial 是所有回收器里额外消耗内存最小的,也没有线程切换的开销,非常简单高效。

二、Parallel垃圾回收器

Parallel垃圾回收器也被称为吞吐量优先的垃圾回收器(吞吐量是指CPU用于执行用户代码的时间和CPU总消耗时间的比值),其目标是达到一个可控制的吞吐量。Parallel Scavenge 用于新生代回收,采用复制算法;Parallel Old 用于老年代回收,采用标记-整理算法。
Parallel垃圾回收器采用自适应调节策略,高吞吐量可以高效率地利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。因此,Parallel垃圾回收器常见在服务器环境中使用。
JDK 8的默认垃圾回收器是Parallel Scavenge + Parallel Old,即使用Parallel Scavenge(新生代)+ Parallel Old(老年代)

三、CMS垃圾回收器

CMS(Concurrent Mark Sweep)垃圾回收器是一种老年代垃圾回收器,它可以在垃圾回收过程中与用户线程并发执行,主要牺牲了系统的吞吐量来追求收集速度,适合追求垃圾收集速度的服务器。
由于CMS使用标记-清除算法,会产生内存碎片,分配对象时内存不足,造成并发失败触发Full GC,这时老年代并发垃圾回收器会退化到Serial Old串行垃圾回收器,使用标记-整理算法并进行整理,整理至碎片减少,才能继续工作,但这会导致垃圾回收的整体时间变长。CMS已经在JDK9中被标记为废弃。

四、G1垃圾回收器

G1是一个并行与并发的标记-复制垃圾回收器,它的设计目标是为了适应不断扩大的内存和不断增加的处理器数量,进一步降低暂停时间(pause time),同时兼顾良好的吞吐量。在JDK 9及以后的版本中,G1垃圾回收器成为了默认的垃圾回收器。
G1回收器将堆内存划分为多个固定大小的Region,每个Region可以是年轻代或老年代的一部分。在进行垃圾回收时,G1可以同时使用多个GC线程,有效利用多核计算能力。

4.1 G1垃圾回收器的步骤

  1. 初始标记(Initial Mark):在此阶段,G1垃圾回收器会暂停所有应用线程(STW),标记出根对象直接关联的对象作为存活对象,并记录下需要处理的存活对象。
  2. 并发标记(Concurrent Marking):在此阶段,应用线程与垃圾回收线程并发执行。垃圾回收线程通过遍历对象图来标记出其他存活对象,并更新标记状态。
  3. 最终标记(Final Mark):在此阶段,G1垃圾回收器会再次暂停所有应用线程,完成并发标记阶段期间可能产生的新增存活对象的标记。
  4. 筛选回收(Live Data Counting and Evacuation):在此阶段,G1垃圾回收器会根据堆内存中的存活对象和空闲空间的大小进行筛选,选择性地回收那些最有价值的区域。它采用了一个优先级队列来决定哪些区域将被优先回收。
  5. 并发清理(Concurrent Cleanup):在此阶段,应用线程与垃圾回收线程并发执行。垃圾回收线程负责清理未使用的对象,并将空闲空间返回给堆。
  6. 对象复制(Object Copying):为了提高内存回收的效率,G1垃圾回收器采用了区域化的方式。在此阶段,它会将存活对象从一个或多个不连续的区域复制到其他空闲的区域中,以便整理出更大的连续空间。
  7. 更新引用(Update References):在此阶段,G1垃圾回收器会更新指向已复制对象的引用,使其指向新的地址。
  8. 重置状态(Reset State):在此阶段,G1垃圾回收器会恢复所有暂停的应用线程,继续正常的应用程序执行。

其中初始标记、最终标记、并发清理和对象复制这几个步骤是STW的

4.2 根对象

G1垃圾回收器会将以下对象作为根对象:

  1. 虚拟机栈(VM Stack)中的本地变量和参数:这些变量包含在方法调用期间创建的对象引用。
  2. 方法区中的静态变量(Static Variables):静态变量是类级别的变量,存储在方法区中,并且一直存在于整个程序的生命周期中。
  3. 常量池(Constant Pool)中的常量引用:常量池是存储字符串常量、符号引用等信息的特殊区域,其中的常量引用也可以作为根对象。
  4. 本地方法栈(Native Method Stack)中的本地变量和参数:与虚拟机栈类似,本地方法栈也包含了本地方法调用期间创建的对象引用。
  5. JNI全局引用:JNI全局引用(JNI Global Reference)是Java Native Interface(JNI)中一种特殊的引用类型,用于跨越Java和本地代码之间的对象引用。在使用JNI调用本地代码时,确保Java对象在本地代码执行期间不被垃圾回收器回收。

4.3 G1垃圾回收器常用参数

-XX:MaxGCPauseMillis:用于设置最大GC暂停时间的目标。默认值是200ms.
-XX:G1SurvivorRatio:用于设置Eden区与Survivor区的比例。默认值是8,survivor TO区:survivor FROM区:老年代 = 1:1:8
-XX:InitiatingHeapOccupancyPercent:启动并发GC周期时的堆内存占用百分比,默认值是45%。

五、ZGC垃圾回收器

ZGC(Z Garbage Collector)是一款在JDK 11中加入的低延迟的垃圾收集器,在JDK 15中成为具有商用的垃圾收集器。ZGC是一款并发的垃圾收集器,主要为了满足如下目标进行设计:

  • 停顿时间不会超过10ms。
  • 停顿时间不会随着堆的增大而增大。
  • 可支持几百M,甚至几T的堆大小。

ZGC使用颜色指针进行标记对象的垃圾状态,当这个被指向的内存发生变化的时候,颜色也就会发生变化。

六、Epsilon垃圾回收器

Epsilon垃圾回收器控制内存分配,但是不执行任何垃圾回收工作。设计的目的是提供一个完全消极的GC实现,分配有限的内存分配,最大限度降低消费内存占用量和内存吞吐时的延迟时间

七、垃圾回收算法

7.1 标记–清除算法

标记–清除算法分为标记和清除两个阶段,标记阶段遍历内存区域,对需要回收的对象打上标记。清除阶段再次遍历内存,对已经标记过的内存进行回收。 缺点是容易产生大量内存碎片

7.2 复制算法

复制算法将内存划分为等大的两块,每次只使用其中的一块。当一块用完了,触发GC时,将该块中存活的对象复制到另一块区域,然后一次性清理掉这块没有用的内存。缺点是内存利用率不高,每次只能使用一半内存。

7.3 标记–整理算法

标记–整理算法分为标记阶段和整理阶段两个阶段:标记阶段与标记-清除算法一样,从根对象开始,遍历所有直接或间接引用的对象,将它们进行标记。整理阶段在回收不存活的对象占用的空间后,将所有的存活对象往一端空闲空间移动,并更新对应的指针。
标记-整理算法是在标记-清除算法的基础上,又进行了对象的移动,因此成本更高,但是却解决了内存碎片的问题。

7.4 分代收集算法

分代收集算法算法并没有新的内容,只是根据对象的存活周期的不同,将内存分为新生代和老年代。新生代中的对象存活时间较短,老年代中的对象存活时间较长。针对不同代采取不同的收集算法。

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

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

相关文章

03MyBatis完成CRUD

准备工作 ○ 创建module(Maven的普通Java模块):mybatis-002-crud ○ pom.xml ■ 打包方式jar ■ 依赖: ● mybatis依赖 ● mysql驱动依赖 ● junit依赖 ● logback依赖 ○ mybatis-config.xml放在类的根路径下 ○ CarMapper.xml放…

Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (二)

这个是继上一篇文章 “Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (一)” 的续篇。在今天的文章中,我们接着来完成如何进行分页及过滤。 分页 - pagination 应用程序处理大量结果通常是不切实际的。 因此&#xff0…

sqlserver 查日志及死锁记录

方 Exec xp_readerrorlog 0 Go 1.2. 2)查询存档编号为n(n Between 0 And 99)的SQL Server日志信息 Exec xp_readerrorlog n 1. 3)根据时间范围查询SQL Server日志信息 Exec xp_readerrorlog 1,1,Null,Null,20091126 20:10,20091126 20:40,Asc 1. 4&am…

【ros笔记】urdf文件

urdf文件属于xml文件&#xff0c;他的标签有&#xff1a; <robot name"robot_name"><!-- 看的见摸的着刚体用link --><link name"base_link"><!-- 可视化部分 --><visual><!-- 几何形状 --><geometry><!-- b…

vue-springboot 音乐推荐系统 带歌词的音乐播放器系统设计与实现 7902c

少数民族音乐网站在流畅性&#xff0c;续航能力&#xff0c;等方方面面都有着很大的优势。这就意味着少数民族音乐网站的设计可以比其他系统更为出色的能力&#xff0c;可以更高效的完成最新的音乐信息、音乐资讯、在线交流等功能。 此系统设计主要采用的是JAVA语言来进行开发&…

基于SpringBoot的教学辅助系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

实战Flink Java api消费kafka实时数据落盘HDFS

文章目录 1 需求分析2 实验过程2.1 启动服务程序2.2 启动kafka生产 3 Java API 开发3.1 依赖3.2 代码部分 4 实验验证STEP1STEP2STEP3 5 时间窗口 1 需求分析 在Java api中&#xff0c;使用flink本地模式&#xff0c;消费kafka主题&#xff0c;并直接将数据存入hdfs中。 flin…

java火车查询管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web火车查询管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

深度学习工具-Jupyter Notebook使用

在本地编辑和运行代码 运行命令jupyter notebook。如果浏览器未自动打开&#xff0c;请打开http://localhost:8888 你可以通过单击网页上显示的文件夹来访问notebook文件。它们通常有后缀“.ipynb”。为了简洁起见&#xff0c;我们创建了一个临时的“test.ipynb”文件。单击后…

用python写个根据水库大坝安全监测excel数据自动生成word水库大坝安全监测报告

要实现这个功能&#xff0c;你需要使用Python中的一些库&#xff0c;如pandas用于处理Excel数据&#xff0c;python-docx用于生成Word文档。 以下是一个简单的示例&#xff0c;展示如何从Excel数据中读取数据&#xff0c;并使用python-docx生成Word报告。 首先&#xff0c;确保…

MySQL第五战:常见面试题(下)

前言&#xff1a; 在当今的IT世界&#xff0c;数据库是任何应用程序的核心。而MySQL&#xff0c;作为最流行的开源关系数据库管理系统&#xff0c;已经成为许多开发者和企业的首选。无论是初创公司还是大型企业&#xff0c;都依赖于MySQL来存储、管理和检索数据。 随着技术的…

Kubernetes 学习总结(44)—— Kubernetes 1.29 中的删除、弃用和主要更改

Kubernetes API 删除和弃用流程 Kubernetes 项目对功能有详细记录的弃用政策。此策略规定&#xff0c;只有当同一 API 的更新、稳定版本可用时&#xff0c;才可以弃用稳定的 API&#xff0c;并且每个稳定性级别的 API 都有最短生命周期。已弃用的 API 是已标记为在未来 Kuber…

计算机网络(超级详细笔记)

使用教材计算机网络&#xff08;第8版&#xff09;&#xff08;谢希仁&#xff09; 第一章&#xff1a;概述 第二章&#xff1a;物理层 第三章&#xff1a;数据链路层 第四章&#xff1a;网络层 第五章&#xff1a;运输层 第六章&#xff1a;应用层 目…

Linux学习第50天:Linux块设备驱动实验(二):Linux三大驱动之一

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 三、使用请求队列实验 1.实验程序编写 使用开发板上的一段RAM来模拟一段块设备&#xff0c;也就是ramdisk. 机械硬盘 34 #define RAMDISK_SIZE (2 * 1024 * 10…

使用即时设计绘制原型设计方便吗?和Axure RP相比怎么样?

对于原型设计&#xff0c;APP 和 Web 都是一样的&#xff0c;因为产品原型是用来确定需求的工具。我们使用这种工具的目的是为了快速迭代&#xff0c;从而深入挖掘和筛选产品的需求。 绘制原型&#xff0c;最重要的原则是&#xff1a;快速、清晰&#xff01; Axure 工具的优缺…

智能合约安全之Solidity重入攻击漏洞的深入理解

漏洞原理 以太坊智能合约的特点之一是能够调用和使用其他外部合约的代码。这些合约通常会操作以太币,经常将以太发送到各种外部用户地址。这种调用外部合约或向外部地址发送以太币的操作,需要合约提交外部调用。这些外部调用可能被攻击者劫持,比如,通过一个回退函数,强迫…

2023APMCM亚太数学建模C题 - 中国新能源汽车的发展趋势(3)

六、问题三的模型建立和求解 6.1问题分析 问题3.收集数据&#xff0c;建立数学模型分析新能源电动汽车对全球传统能源汽车行业的影响。 本题要求建立模型分析新能源电动汽车对全球传统能源汽车行业的影响。由于数据集可能略大&#xff0c;而在处理复杂问题、大量特征和大规模…

Python YAML数据驱动:实现自动化测试的利器

引言&#xff1a; 在软件开发过程中&#xff0c;自动化测试是保证软件质量的重要环节。而数据驱动测试作为一种常见的测试方法&#xff0c;通过使用不同的测试数据来验证软件的功能和性能。本文将介绍如何使用Python中的YAML库来实现数据驱动测试&#xff0c;以及如何利用YAML数…

spatialRF

官网&#xff1a;Easy Spatial Modeling with Random Forest • spatialRF (blasbenito.github.io) spatialRF是一种在考虑空间自相关的前提下&#xff0c;利用随机森林对空间数据进行回归并解释的R包。 数据要求 参数命名 data&#xff1a;训练集&#xff0c;data frame。 …

基于SpringBoot的房屋租赁管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…