【JVM】垃圾收集器详解

你将学到

1. Serial 收集器

2. ParNew 收集器

3. Parallel Scavenge 收集器

4. Serial Old 收集器

5. Parallel Old 收集器

6. CMS 收集器

7. G1 收集器


在 Java 中,垃圾回收(GC)是自动管理内存的一个重要机制。HotSpot JVM 提供了多种垃圾收集器,供开发者根据不同的应用场景进行选择。每种垃圾收集器都有其独特的实现原理、优缺点以及适用场景。在这篇博客中,我们将详细介绍 HotSpot JVM 中的 7 种垃圾收集器,帮助开发者更好地理解它们,并在不同的项目中做出最优的选择。 

 HotSpot 虚拟机中的7个垃圾收集器,图中有连线的说明是可以一起搭配使用的,下面针对每一个垃圾收集器,作单独的讲解。


1. Serial 收集器

Serial收集器是在进行垃圾收集时,必须暂停其他所有工作线程(Stop The World)。Stop The World并不是啥好事,因为它会导致用户线程停止工作,所以有些真实应用来说是无法接受的。

总结:

  • Serial 翻译为串行,也就是说它以串行的方式执行Serial 是新生代的垃圾收集器
  • 算法:复制算法
  • HotSpot 虚拟机运行在客户端模式下的默认新生代收集器

2. ParNew 收集器

ParNew垃圾收集器Parallel Garbage Collector 的一个变种,它专门用于 年轻代(Young Generation) 的垃圾回收,ParNew 的设计目的是提高 年轻代垃圾回收的吞吐量,通常通过 并行处理 来缩短回收时间,减少停顿时间。

总结:

  • 垃圾收集时是多线程并行的
  • ParNew是新生代的垃圾收集器
  • 使用的是复制算法
  • 在 CMS 收集器中,ParNew 用于年轻代垃圾回收,而老年代则由 CMS 来进行回收。ParNew 和 CMS 共同合作,减少了老年代的 Full GC 触发次数,并优化了停顿时间
  • 使用 -XX:ParallelGCThreads 参数来设置GC线程数

3. Parallel Scavenge 收集器

Parallel Scavenge 收集器,是 HotSpot JVM 中的一种 年轻代(Young Generation) 垃圾收集器。它专注于提高 吞吐量,通过并行化的方式来减少垃圾回收过程中的时间开销。Parallel Scavenge 是基于 复制算法(Copying Algorithm)实现的,并且通过多线程的方式来加速垃圾回收过程。这里的吞吐量指 CPU 用于运行用户代码的时间占总时间的比值。

吞吐量 = 运行用户代码的时间/(运行用户代码的时间+运行垃圾收集的时间)

Parallel Scavenge收集器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间 的-XX:MaxGCPauseMilis参数 以及直接设置吞吐量大小的-XX:GCTimeRatio参数。

总结

  • 吞吐量优先收集器
  • 新生代垃圾收集器
  • 算法:复制算法
  • 两个精确控制吞吐量的参数
    • 控制最大垃圾收集停顿时间:-XX:MaxGCPauseMilis。
    • 直接设置吞吐量大小:XX:GCTimeRatio。
  • GC 自适应的调节策略开关:开启开关,就不需要手动指定新生代的大小(-Xmm)、Eden 和 Survivor 区的比例、晋升老年代对象年龄等细节参数了。虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量。(XX:+UseAdaptiveSizePolicy)

4. Serial Old 收集器

erial Old 收集器 是 HotSpot JVM 中的一种 老年代(Old Generation) 垃圾收集器。它是 Serial Garbage Collector 的一个扩展版本,用于全堆垃圾回收时处理老年代的内存。Serial Old 的设计理念和 Serial GC 一致,主要特点是使用 单线程 执行垃圾回收任务,适用于资源受限或者对垃圾回收停顿时间不敏感的场景。

总结

  • 老年代收集器
  • 算法:标记-整理算法
  • gc时暂停所有用户线程
  • 主要作为客户端模式下的HotSpot虚拟机使用,另外也作为CMS收集器并发收集发生Concurrent Mode Failure时的后备预案使用

5. Parallel Old 收集器

Parallel Old是Paralle Scavenge收集器的老年代版本,多线程并行收集。目前只能与新生代的Parallel Scavenge收集器搭配使用,可以说Parallel Old就是为Parallel Scavenge而生的。在这之前Parallel Scavenge收集器只能与老年代的Serial Old进行搭配,但是一个多线程,一个单线程,导致吞吐量并没有充分的提升,直到Parallel Old收集器出现。

总结:

  • Parallel Old为Parallel Scavenge而生,只能搭配Parallel Scavenge。
  • Parallel Old采用多线程
  • 算法:标记-整理
  • 在注重吞吐量以及处理器资源较为稀缺的场合,都可以优先考虑Parallel Scavenge加Parallel Old收集器这个组合
  • JDK 6时才开始提供

6. CMS 收集器

CMS(Concurrent Mark-Sweep) 收集器是 HotSpot JVM 提供的一种 低延迟 垃圾收集器,旨在减少垃圾回收过程中的停顿时间。它的主要目标是 最小化停顿时间,使得应用程序能够在垃圾回收的过程中尽可能保持运行状态,特别适用于对响应时间敏感的应用。

原理

CMS 收集器主要采用了 标记-清除(Mark-Sweep)算法,结合了并发执行来优化标记和清除阶段,减少了停顿时间。它的工作过程分为多个阶段:

  1. 初始标记(Initial Mark)

    • 初始标记阶段是 Stop-the-World 的,这意味着在这个阶段应用程序会暂停。该阶段会标记 GC Root 可达的对象。
    • 这个阶段会很快完成,因为只标记根对象的引用,不需要遍历整个堆。
  2. 并发标记(Concurrent Mark)

    • 在并发标记阶段,CMS 会并发地扫描整个堆,标记出所有存活的对象。
    • 这个阶段是 并发执行的,也就是说,在标记阶段,应用程序的线程可以继续运行,尽量减少停顿时间。
    • 但并发标记阶段的执行时间较长,且可能需要使用多个 CPU 核心来加速标记过程。
  3. 重新标记(Remark)

    • 在并发标记完成后,还需要进行 重新标记 阶段。这个阶段用于标记在并发标记过程中被修改的对象(即那些在并发标记过程中被修改了引用关系的对象)。此阶段也是 Stop-the-World 的,因此应用程序会暂停。
    • 重新标记是一个很短的阶段,主要用于修正并发标记阶段标记不全的问题。
  4. 并发清除(Concurrent Sweep)

    • 在并发清除阶段,CMS 会清理那些没有被标记为存活的垃圾对象。
    • 这个阶段是并发执行的,应用程序线程可以继续运行。

优点 并发收集,低停顿

不足

  • 吞吐量低:CMS追求用户线程停顿时间少,停顿时间少就只能与用户线程并发执行部分阶段,导致整个垃圾回收需要执行的整体时间会更长(停顿之后专心垃圾收集肯定是最快的),所以吞吐量会降低
  • 浮动垃圾问题:并发清除阶段,由于gc线程是与用户线程并发的,这个期间用户还会产生新的垃圾,所以一般会预留出一部分内存,不能等到老年代快满的时候才去收集,如果预留的内存不足以存放这部分浮动垃圾的话,就会出现Concurrent ModeFailure。出现这个错误之后,虚拟机将临时启用 Serial Old 来替代 CMS
  • 使用标记-清除算法:因为没有整理的过程,所以垃圾收集完之后,会有很多空间碎片,导致需要分配大块连续内存的时候,空间不足

7. G1 收集器

Garbage First(简称G1)收集器,意为垃圾优先,哪一块的垃圾最多就优先清理它。从名字就可以看出G1的一个特性,那就是G1能对不同区块的内存进行回收价值和成本排序,即价值越高成本越低的区块会被先回收。另外我们还能为G1设定性能指标,例如任意 1秒内暂停时间不超过 10 毫秒,G1会尽力去达成这个目标。

开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。JDK8 Update 40这个版本以后的G1收集器被Oracle官方称为“全功能的垃圾收集器”。JDK 9发布之 日,G1宣告取代Parallel Scavenge加Parallel Old组合,成为服务端模式下的默认垃圾收集器。

G1依然还是采用了分代设计,但是之前的一些垃圾收集器有很大差别,不会在为新生代,老年代等分配规定大小的区域,而是将整个堆分成一个个大小固定的Region区域每一个Region都可以是新生代,老年代,Eden空间,Survivor空间的角色。所以Region成为了垃圾收集的最小单元,每一次回收都会是Region的整数倍大小。

  • 初始标记:仅仅只是标记一下GC Roots能直接关联到的对象。(需要停顿)
  • 并发标记:从GC Roots开始进行可达性分析,完成对象图的扫描,判断存活对象和可回收对象。做后再处理下SATB记录的有引用变动的对象(无需停顿)
  • 最终标记:对用户线程做另一个短暂的停顿,用于处理并发阶段结束后仍遗留 下来的最后那少量的SATB记录。(需要停顿)
  • 筛选回收:统计各个Region的回收价值和成本并进行排序,根据用户所期望的停顿时间来制定回收计划,筛选任意多个Region构成回收集,然后把决定回收的那一部分Region的存活对象复制到空的Region中,再清理掉整个旧 Region的全部空间。(需要停顿) 

总结:

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

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

相关文章

代码随想录算法训练营day35

代码随想录算法训练营 —day35 文章目录 代码随想录算法训练营前言一、01背包问题 二维二、 01背包问题 一维 (滚动数组)三、416. 分割等和子集总结 前言 今天是算法营的第35天,希望自己能够坚持下来! 今天开始是背包问题了&…

低代码系统-产品架构案例介绍、简道云(七)

今天分析另外一个零代码、低代码产品-简道云,跟所有低代码产品的架构图一样,高、大、炫、美。 依然是从下至上,从左到右的顺序。 开发层 搭建中心 表单、流程、报表、用户中心,还是这些内容,自定义打印很多平台都有&am…

J1打卡——鸟类识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 1.检查GPU import tensorflow as tf gpustf.config.list_physical_devices("GPU") if gpus:tf.config.experimental.set_memory_growth(gpus[0],True…

不建模,无代码,如何构建一个3D虚拟展厅?

在数字化浪潮的推动下,众多企业正积极探索线上3D虚拟展厅这一新型展示平台,旨在以更加生动、直观的方式呈现其产品、环境与综合实力。然而,构建一个既专业又吸引人的3D虚拟展厅并非易事,它不仅需要深厚的技术支持,还需…

翻译:How do I reset my FPGA?

文章目录 背景翻译:How do I reset my FPGA?1、Understanding the flip-flop reset behavior2、Reset methodology3、Use appropriate resets to maximize utilization4、Many options5、About the author 背景 在写博客《复位信号的同步与释放(同步复…

开源物业管理系统助力高效管理与服务提升

内容概要 开源物业管理系统为物业行业带来了诸多革新,能有效提升管理质量和服务水平。这个系统不仅灵活,适应性强,还能通过智能化功能满足各种复杂的物业管理需求。我们知道,对于物业公司来说,合理的资源配置至关重要…

UE5 开启“Python Remote Execution“

demo 代码 remote_execution.py 远程调用UE5 python代码-CSDN博客 在启用 Unreal Engine 5(UE5)的“Python 远程执行”功能后,UE5 会启动一个 UDP 组播套接字服务,以监听来自外部应用程序的 Python 命令。 具体行为如下&#xf…

web应用引入cookie机制的用途和cookie技术主要包括的内容

web应用引入cookie机制,用于用户跟踪。 (1)HTTP响应报文中的Cookie头行:set-Cookie (2)用户浏览器在本地存储、维护和管理的Cookie文件 (3)HTTP请求报文中的Cookie头行:…

win32汇编环境,按字节、双字等复制字符的操作

;运行效果 ;win32汇编环境,按字节、双字等复制字符的操作 ;这是汇编的优点之一。我们可以按字节、双字、四字、八字节等复制或挨个检查字符。 ;有时候,在接收到的一串信息中,比如访问网站时,返回的字串里,有很多0值存在&#xff0…

Node.js接收文件分片数据并进行合并处理

前言:上一篇文章讲了如何进行文件的分片:Vue3使用多线程处理文件分片任务,那么本篇文章主要看一下后端怎么接收前端上传来的分片并进行合并处理。 目录: 一、文件结构二、主要依赖1. express2. multer3. fs (文件系统模块)4. pat…

《offer 来了:Java 面试核心知识点精讲 -- 框架篇》(附资源)

继上篇文章介绍了《offer 来了:Java 面试核心知识点精讲 -- 原理篇》书后,本文章再给大家推荐兄弟篇 《offer来了:Java面试核心知识点精讲--框架篇》, 简直就是为Java开发者量身定制的面试神器。 本书是对Java程序员面试中常见的…

iOS 权限管理:同时请求相机和麦克风权限的最佳实践

引言 在开发视频类应用时,我们常常会遇到需要同时请求相机和麦克风权限的场景。比如,在用户发布视频动态时,相机用于捕捉画面,麦克风用于录制声音;又或者在直播功能中,只有获得这两项权限,用户…

docker Ubuntu实战

目录 Ubuntu系统环境说明 一、如何安装docker 二、发布.netcore应用到docker中 Ubuntu系统环境说明 cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.5 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04.5 LTS (Jammy Jellyfish)&quo…

线上突发:MySQL 自增 ID 用完,怎么办?

线上突发:MySQL 自增 ID 用完,怎么办? 1. 问题背景2. 场景复现3. 自增id用完怎么办?4. 总结 1. 问题背景 最近,我们在数据库巡检的时候发现了一个问题:线上的地址表自增主键用的是int类型。随着业务越做越…

Golang之Context详解

引言 之前对context的了解比较浅薄,只知道它是用来传递上下文信息的对象; 对于Context本身的存储、类型认识比较少。 最近又正好在业务代码中发现一种用法:在每个协程中都会复制一份新的局部context对象,想探究下这种写法在性能…

从桌面到前端:效率与渲染优化的技术进化20250122

从桌面到前端:效率与渲染优化的技术进化 在应用开发的广袤天地中,我们见证了从传统桌面开发(如 MFC、PyQt)向现代 Web 前端框架(如 React、Vue)的华丽转变。这一变革犹如一场技术革命,带来了开…

web服务器 网站部署的架构

WEB服务器工作原理 Web web是WWW(World Wide Web)的简称,基本原理是:请求(客户端)与响应(服务器端)原理,由遍布在互联网中的Web服务器和安装了Web浏览器的计算机组成 客户端发出请求的方式:地址栏请求、超链接请求、表单请求 …

快速构建springboot+vue后台管理系统

项目介绍 1.需求定义:外包项目如雨后春笋,开发工期被迫压缩,为了开发人员专注开发项目业务,早点下班能陪老婆、孩子。 2.产品定位: 简约后台管理系统 3.项目特点:此项目代码清晰、界面简洁、springboot layuiadmin 构…

C语言--数据在内存中的存储

数据在内存中的存储 主要研究整型和浮点型在内存中的存储。 1. 整数在内存中的存储 在学习操作符的时候,就了解过了下面的内容: 整数的2进制表示方法有三种,即原码、反码和补码。 有符号的整数,三种表示方法均有符号位和数值…

HTB:Sauna[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机…