JVM虚拟机系统性学习-垃圾回收器CMS、G1和ZGC

CMS:低延迟

  • 在 JDK1.5 时,HotSpot 推出了 CMS 收集器,CMS 收集器是 HotSpot 虚拟机中第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程和用户线程同时工作
  • CMS 收集器关注尽可能地降低用户线程的停顿时间,停顿时间越短,用户的体验越好
  • CMS 收集器采用标记-清除算法和STW机制来回收内存
  • CMS 作为老年代的收集器无法与之前的新生代收集器 Parallel Scavenge 配合工作,所以在 JDK1.5 时使用 CMS 收集老年代,新生代只可以选择 ParNew 或者 Serial

在这里插入图片描述

CMS收集过程

CMS收集过程较为复杂,分为4个阶段:

  • 初始标记:会出现 STW,所有工作线程停止,该阶段主要标记与GC Roots能直接关联的对象,由于直接关联的对象很少,所以速度很快
  • 并发标记:从GC Roots的直接关联对象开始遍历整个对象图的过程,这个阶段比较耗时但是不需要暂停用户线程
  • 重新标记:在并发标记阶段,由于用户线程和垃圾收集线程同时运行,因此在这个阶段修正并发标记阶段因为用户线程运行而产生变动的对象的标记,这个阶段速度虽然比初始标记阶段慢点,但是比并发标记阶段快多了
  • 并发清除:清除标记阶段判断的已经死亡的对象,释放内存空间

虽然 CMS 是并发收集器,但是仍然存在短暂的 STW 时间

并且在 CMS 回收过程中,需要确保用户线程有足够的内存可以使用,因此在堆内存使用率达到某一阈值,就需要开始内存回收,如果 CMS 运行期间预留的内存不够用户线程使用的话,会临时启动 Serial Old 收集器来回收老年代。

优点

  • 并发收集
  • 低延迟

缺点

  • 使用标记-清除算法,会有内存碎片。在无法分配大对象的情况下,不得不提前触发Full GC
  • CMS收集器对CPU资源非常敏感。虽然不会导致用户线程停顿,但是会因为占用了一部分线程而导致应用线程变慢,总吞吐量降低
  • CMS收集器无法处理浮动垃圾。如果在并发标记阶段产生新的垃圾对象,CMS收集器将无法对这些垃圾对象进行标记,只能等下一次执行GC的时候进行回收

JDK后续版本中CMS的变化

  • JDK9 中,CMS 被标记为 Deprecate,即 CMS 未来将会被废弃
  • JDK14 中,删除 CMS 垃圾收集器

G1:区域化分代式

G1(Garbage-First)垃圾收集器是在 Java7 update4 之后引入的一个新的垃圾收集器,它开创了收集器面向局部收集的设计思路和基于 Region 的内存布局形式

  • G1的出现就是为了适应不断扩大的内存和不断增加的处理器数量,进一步降低暂停时间,同时兼顾良好的吞吐量
  • G1是一款面向服务端应用的垃圾收集器,主要针对配备多核CPU以及大容量内存的机器,兼顾了低GC停顿时间和高吞吐量
  • 在 JDK1.7 正式启用,是 JDK 9以后的默认垃圾收集器,取代了 CMS 以及 Parallel+Parallel Old 的组合,被 Oracle 官方称为“全功能的垃圾收集器”

在这里插入图片描述

为什么叫做 Garbage First 呢?

  • Garbage First 也就是垃圾优先,G1 是一个并行回收器,将堆内存分割为多个不相关区域,称为 Region,使用不同的 Region 来表示 Eden、Survivor0、Survivor1、老年代等
  • G1有计划地避免在整个 Java 堆中进行全区域的垃圾收集,G1跟踪各个Region的垃圾堆积的价值大小,在后台维护一个优先级列表,每次根据允许的收集时间,优先回收价值最大的Region,G1侧重于回收垃圾最大量的区间,因此称之为Garbage-First 垃圾优先

G1 应用场景

  • 服务端应用,针对具有大内存、多处理器的机器
  • 最主要的应用是需要低 GC 延迟、并且具有大堆的应用程序
  • HotSpot 除了 G1,其他的垃圾收集器使用内置的 JVM 线程执行 GC 的多线程操作,而 G1 采用应用线程承担后台运行的 GC 工作,即当 JVM 的 GC 线程处理速度慢时,系统会调用应用程序线程帮助加速垃圾回收过程

G1 执行过程

  1. 初始标记:标记一下 GC Roots 能直接关联到的对象,需要停顿线程,但耗时很短

  2. 并发标记:是从 GC Roots 开始对堆中对象进行可达性分析,找出存活的对象,这阶段耗时较长,但可与用户程序并发执行

  3. 最终标记:修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录

  4. 筛选回收:对各个 Region 的回收价值和成本进行排序,根据用户所期望的 GC 停顿时间来制定回收计划

Humongous 区域:

在G1中,有一种特殊的区域叫Humongous区域

  • 如果一个对象占用的空间超过了分区容量 50% 以上,G1 收集器就认为这是一个巨型对象。 这些巨型对象,默认直接会被分配在老年代
  • 但是,如果是一个短期存在的巨型对象,在分区之间来回拷贝,就会对垃圾收集器造成负面影响。为了解决这个问题,G1 划分了 Humongous 区,它用来专门存放巨型对象。如果一个 H 区装不下一个巨型对象,那么 G1 会寻找连续的 H 分区来存储

G1 相关参数:

-XX:+UseG1GC
# 使用 G1 垃圾收集器
-XX:MaxGCPauseMillis=
# 设置期望达到的最大GC停顿时间指标(JVM会尽力实现,但不保证达到),默认值是 200 毫秒。
-XX:G1HeapRegionSize=n
# 设置的 G1 区域的大小。值是 2 的幂,范围是 1 MB 到 32 MB 之间。
# 目标是根据最小的 Java 堆大小划分出约 2048 个区域。
# 默认是堆内存的1/2000。
-XX:ParallelGCThreads=n
# 设置并行垃圾回收线程数,一般将n的值设置为逻辑处理器的数量,建议最多为8。
-XX:ConcGCThreads=n
# 设置并行标记的线程数。将n设置为ParallelGCThreads的1/4左右。
-XX:InitiatingHeapOccupancyPercent=n
# 设置触发标记周期的 Java 堆占用率阈值。默认占用率是整个 Java 堆的 45%。

优势

  • 并行与并发
    • 并行:G1 在回收期间,可以有多个 GC 线程同时工作,此时用户线程 STW
    • 并发:G1 部分工作可以和应用程序同时执行
  • 分代收集
    • G1 将堆空间分为若干个区域 Region,这些区域包含了逻辑上的新生代和老年代
    • 之前的垃圾收集器要么工作在新生代,要么工作在老年代,而 G1 同时兼顾了新生代和老年代
  • 空间整合
    • G1 将堆内存划分为若干 Region,内存回收以 Region 为单位,Region 之间是复制算法,整体上可以看作是标记-压缩算法,两种算法都可以避免出现内存碎片
  • 可预测的停顿时间模型
    • G1 除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不超过N毫秒

ZGC:低延迟

在 JDK11 中引入的一种可扩展的低延迟垃圾收集器,在 JDK15 中发布稳定版

ZGC 的目标是在尽可能对吞吐量影响不大的前提下,实现在任意堆内存大小都可以把垃圾收集的停顿时间限制在 10 ms 以内(在 JDK16 之前是 10 ms,在 JDK16 之后目标是 1 ms 的低延迟)的低延迟

ZGC 收集器也是基于 Region 内存布局,使用了读屏障染色指针内存多重映射等技术来实现可并发的标记-整理算法的,以低延迟为首要目标的一款垃圾收集器。ZGC 的核心是一个并发垃圾收集器,这意味着所有繁重的工作都在 Java 线程继续执行的同时完成。这极大地限制了垃圾收集对应用程序响应时间的影响

ZGC 的关键技术

ZGC 通过 染色指针读屏障 技术解决了对象转移过程中准确访问对象的问题,实现了垃圾回收过程中对象的并发转移

具体细节这里先略过,可以参考美团技术团队的文章新一代垃圾回收器ZGC的探索与实践

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

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

相关文章

linux常见错误

1.E45: ‘readonly‘ option is set (add ! to override) 首先使用以下命令从Vim编辑器中出来::qa!(强制退出) 接下来,使用sudo vim filename和更高版本::wq 2.Bash script – "/bin/bash^M: bad interpreter: No such file or direc…

如何退回chrome旧版ui界面?关闭Chrome浏览器新 UI 界面

之前启用新UI的方式 Chrome 已经很久没有进行过大的样式修改,但近期在稳定分支中添加了新的 flags 实验性标志,带来了全新的设计与外观,启用方式如下: 在 Chrome 浏览器的搜索栏中输入并访问 chrome://flags 搜索“refresh 2023…

高效营销系统集成:百度营销的API无代码解决方案,提升电商与广告效率

百度营销API连接:构建无代码开发的高效集成体系 在数字营销的高速发展时代,企业追求的是快速响应市场的能力以及提高用户运营的效率。百度营销API连接正是为此而生,它通过无代码开发的方式,实现了电商平台、营销系统和CRM的一站式…

第十一章 SpringCloud Alibaba 实现Rocketmq–消息驱动

MQ简介 什么是MQ MQ(Message Queue)是一种跨进程的通信机制,用于传递消息。通俗点说,就是一个先进先出的数 据结构。 MQ的应用场景 异步解耦 最常见的一个场景是用户注册后,需要发送注册邮件和短信通知&#xff…

Qt中槽函数在那个线程执行的探索和思考

信号和槽是Qt的核心机制之一,通过该机制大大简化了开发者的开发难度。信号和槽属于观察者模式(本质上是回调函数的应用)。是函数就需要考虑其是在那个线程中执行,本文讨论的就是槽函数在那个线程中执行的问题。 目录 1. connect…

[BUG]TDA4 main域 CAN 无法进中断

目录 关键词平台说明一、背景二、根本原因2.1 Com模块 三、措施 关键词 嵌入式、C语言、autosar、TDA4 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C,C编译器HighTec (GCC) 一、背景 在将mcu域的部分can 移植到main域的时候发现无法进…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑灵活性资源传输精细化建模的配电网优化运行》

这个标题表达的是关于配电网优化运行的一个概念,其中考虑了灵活性资源传输的精细化建模。让我们逐个解读关键词: 考虑灵活性资源传输:这指的是在配电网优化运行中考虑到不同类型的灵活性资源的传输。灵活性资源包括可再生能源、储能系统、柔性…

HarmonyOS首次尝试-HelloWorld

我的旧手机是个HUAWEI PCT-AL10 HarmonyOS 3.0.0(Android 10) 插上后,studio能显示连接上了手机设备,创建的demo使用的是API9,也就是当前的最新版本。 点击运行报错: 点击去往帮助页,做的也挺好,有直达的…

抠图软件哪个好用?什么软件可以抠图换背景?

抠图软件哪个好用?在图片处理中,抠图换背景是一项常见的操作。很多新手可能会对此感到困惑,不知道应该使用什么软件来进行抠图换景。实际上,现在市面上有很多图片处理软件都具备抠图换背景的功能,每款软件都有其优缺点…

开辟“护眼绿洲”,荣耀何以为师?

文 | 智能相对论 作者 | 佘凯文 俗话说,眼睛是心灵的窗户,可如今,人们对于这扇“窗户”的保护,似乎越来越不重视。 据人民日报今年发布的调查显示,中国眼病患病人数2.1亿,近视患者人数多达6亿&#xff0…

Python学习之爬虫基础

目录 文章声明⭐⭐⭐让我们开始今天的学习吧!requests库的基本使用BeautifulSoup解析HTML我们还需要学习什么呢? 文章声明⭐⭐⭐ 该文章为我(有编程语言基础,非编程小白)的 Python爬虫自学笔记知识来源为 B站UP主&…

【JVM从入门到实战】(五)类加载器

一、什么是类加载器 类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。 类加载器只参与加载过程中的字节码获取并加载到内存这一部分。 二、jdk8及之前的版本 类加载器分为三类: 启动类加载器-加载Ja…

2043杨辉三角(C语言)

目录 一:题目 二:思路分析 三:代码 一:题目 二:思路分析 1.通过杨辉三角,不难发现中间的数等于肩头两个数之和 2.但是当我们的输出结果,与杨辉三角的形式有所不同,但是我们可以找…

【Linux】高性能 Web 服务器 Nginx 安装教程(Ubuntu 22.04)

前言 Nginx 是一个高性能的开源 Web 服务器软件,也可以用作反向代理服务器、负载均衡器、HTTP 缓存以及作为邮件代理服务器等。Nginx 以其高性能、稳定性和丰富的功能而闻名,被广泛用于构建高流量网站和应用程序。 步骤 更新软件源 首先需要更新系统的软…

AttributeError: module ‘edge_tts‘ has no attribute ‘Communicate‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

pycdc配置和使用

配置 使用的kali2023版本 安装cmake pip install cmake 下载pycdc git clone https://github.com/zrax/pycdc 切换到pycdc目录 cd pycdc 进行cmake cmake CMakeLists.txt make 使用 显示帮助信息 ./pycdc -h 显示帮助信息 反编译 ./pycdc /home/kali/Desktop/main…

瑞萨单片机学习:RA4M3单片机 BOOTloader升级 跳转到主程序 主程序无法执行问题

背景: 使用瑞萨的RA4M3单片机编写BOOT引导程序进行测试,在BOOT程序跳转到主程序时,主程序无法执行。本文介绍了问题的定位和解决方法。 运行开发环境介绍 硬件环境 RA4M3 官方开发板 J-LINK V11 开发板自带 软件开发环境 e2 studio VSCODE…

【MySQL基础】MySQL基本操作详解

系列文章目录 第1篇:【MySQL基础】MySQL介绍及安装 第2篇:【MySQL基础】MySQL基本操作详解 文章目录 ✍1,数据库操作     🔍1.1,查看数据库     🔍1.2,创建数据库     🔍1.3,选择数据库    …

探索太空深渊:计算机技术在航天领域的无限可能

探索太空深渊:计算机技术在航天领域的无限可能 一、引言 在21世纪的科技浪潮中,太空探索和计算机技术无疑是两个最为璀璨夺目的领域。它们各自的发展都足以改变人类社会的未来,而当这两者交汇时,所激发出的创新和变革更是超乎我…

算法通关第十九关-青铜挑战理解动态规划

大家好我是苏麟 , 今天聊聊动态规划 . 动态规划是最热门、最重要的算法思想之一,在面试中大量出现,而且题目整体都偏难一些对于大部人来说,最大的问题是不知道动态规划到底是怎么回事。很多人看教程等,都被里面的状态子问题、状态…