JVM之经典垃圾回收器

1.垃圾回收器的分类

处理范围划分:

新生代垃圾回收器:serial、parNew、parallel scavenge;

老年代垃圾回收器:serial Old、parallel Old、CMS;

整堆收集器:G1、ZGC;

2.Serial GC

        Serial是单线程的串行垃圾回收器,主要采用标记-复制算法 进行垃圾回收。
        单线程地好处就是减少上下文切换,减少系统资源的于但这种方式的缺点也很明显,在GC的过程中,必须暂停其他所有的工作线程,直至Serial收集器收集结束为止(Stop The World)。若GC不是频繁发生,这种方法会很不错,否则会影响程序的执行性能。

3.serial old 


        Serial Old是Serial的老年代版本,也是个单线程收集器,适用于老年代,使用的是标记-整理算法优缺点基本和Serial差不多,二者主要是回收算法不一样。

4.parNew

        ParNew其实就是Serial的多线程版本,在参数、回收算法上,和Serial是完全一样的,所以他也是采用标记-复制算法 进行垃圾回收的。
        ParNew在垃圾回收的时候,同样会STW,但是因为它是多线程并行进行垃圾回收的,所以通常情况下时间会比Serial短一些。

5.Parallel Scavenge


        Parallel Scavenge 也是一个新生代的垃圾回收器,和ParNew一样,他也是多线程并行执行的,同样采用的也是 标记-复制算法。与ParNew最大的不同是,Parallel Scavenge 关注的是垃圾回收的吞吐量(吞吐量=代码运行时间/(代码运行时间+垃圾收集时间),以吞吐量优先。
        因为Parallel Scavenge收集器的高吞吐量可以最高效率的利用CPU时间,尽快的完成程序的运算任务等,所以他主要适合在后台运算,比如一些定时任务的执行。

6.Parallel Old


        Parallel是Parallel Scavenge的老年代版本,同样是一个关注吞吐量的并行垃圾收集器,他采用的是标记-整理算法算法进行垃圾回收的。

7.CMS


        CMS,Concurrent Mark Sweep,同样是老年代的收集器。他也是一个并发执行的垃圾收集器,他和Parallel最大的区别是他更加关注垃圾回收的停顿时间,通过他的名字Concurrent Mark Sweep就可以知道,他采用的是耗时更短的标记-清除算法。

1)初始标记:标记所有从GCRoot直接可达的对象。这一步骤需要STW,即暂停所有应用线程,但由于只标记直接可达的对象,因此这个阶段通常很快。
2)并发标记:从初始标记阶段标记的对象出发,遍历整个对象图,标记所有可达的对象。在此阶段,GC线程与应用线程同时运行,不需要STW。
3)预清理:这一阶段也是并发执行的,目的是在实际清理前,处理并发标记阶段结束后和重新标记阶段开始前这段时间内发生的变化。目的是减少重新标记阶段的工作量。
4)重新标记:这一阶段是为了修正并发标记期间因应用线程继续运行而产生的更改。这是另一个需要STW的阶段。
5)并发清理:在此阶段,GC线程清除不可达的对象,并回收它们占用的内存空间。这个阶段与应用线程并发执行,不需要STW。

缺点:

1)无法处理浮动垃圾,在最后一步并发清除过程中,用户线程执行也会产生垃圾,但这部分垃圾是在标记之后,所以只能等到下一次gc的时候清理掉。

2)cms使用的标记清除算法,会产生大量的垃圾碎片

8.G1

        G1,Garbage First,是CMS的改进版,解决了CMS内存碎片、更多的内存空间等问题。总之,G1是一个先进的垃圾收集器,它可以提高系统的吞吐量,降低停顿的频率,并且可以有效管理大型堆。在JDK9之后,G1成为了默认的垃圾回收器。它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。

        G1开创的基于Region的堆内存布局是它能够实现这个目标的关键。虽然G1也仍是遵循分代收集理论设计的,但其堆内存的布局与其他收集器有非常明显的差异:G1不再坚持固定大小以及固定数量的分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。收集器能够对扮演不同角色的Region采用不同的策略去处理,这样无论是新创建的对象还是已经存活了一段时间、熬过多次收集的旧对象都能获取很好的收集效果。

        Region中还有一类特殊的 Humongous 区域,专门用来存储大对象。 G1 认为只要大小超过了一个Region容量一半的对象即可判定为大对象。
G1收集器的 运作过程大致可划分为以下四个步骤
· 初始标记 Initial Marking ):仅仅只是标记一下 GC Roots 能直接关联到的对象,并且修改 TAMS
指针的值,让下一阶段用户线程并发运行时,能正确地在可用的 Region 中分配新对象。这个阶段需要 停顿线程,但耗时很短,而且是借用进行Minor GC 的时候同步完成的,所以 G1 收集器在这个阶段实际 并没有额外的停顿。
· 并发标记 Concurrent Marking ):从 GC Root 开始对堆中对象进行可达性分析,递归扫描整个堆
里的对象图,找出要回收的对象,这阶段耗时较长,但可与用户程序并发执行。当对象图扫描完成以后,还要重新处理SATB 记录下的在并发时有引用变动的对象。
· 最终标记 Final Marking ):对用户线程做另一个短暂的暂停,用于处理并发阶段结束后仍遗留
下来的最后那少量的 SATB 记录。
· 筛选回收 Live Data Counting and Evacuation ):负责更新 Region 的统计数据,对各个 Region 的回 收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划,可以自由选择任意多个Region 构成回收集,然后把决定回收的那一部分Region 的存活对象复制到空的 Region 中,再清理掉整个旧 Region的全部空间。这里的操作涉及存活对象的移动,是必须暂停用户线程,由多条收集器线程并行完成的。

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

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

相关文章

数据结构——线性表(循环链表)

一、循环链表定义 将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一 个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked list)。 循环链表解决了一个很麻烦的问题。如何从当中一 个结点出发&am…

STM32测测速---编码电机读取速度的计算

1、首先先了解一下计算的公式 速度计算: 轮胎每转一圈的脉冲数取决于编码器的分辨率,可由下面公式进行计算: PPR是电机的线数 以GA25-370电机为例。 图片来源:第四节:STM32定时器(4.JGA25-370霍尔编码器…

【23】Android高级知识之Window(四) - ThreadedRenderer

一、概述 在上一篇文章中已经讲了setView整个流程中,最开始的addToDisplay和WMS跨进程通信的整个过程做了什么。继文章Android基础知识之Window(二),这算是另外一个分支了,接着讲分析在performTraversals的三个操作中,最后触发pe…

昇思25天学习打卡营第11天|基于 MindSpore 实现 BERT 对话情绪识别

BERT是一种先进的语言模型,由Google在2018年推出。它通过双向编码器Transformer的Encoder部分,捕捉词语和句子的深层含义。BERT的创新之处在于其预训练方法,特别是Masked Language Model和Next Sentence Prediction,这使得它在问答…

【python 已解决】ImportError: No module named ‘example‘ 详解与解决方案

【python 已解决】ImportError: No module named example 详解与解决方案 在Python编程中,ImportError是一个常见的异常类型,它表明Python解释器无法导入指定的模块。当你看到错误提示“ImportError: No module named ‘example’”时,这意味…

基于Llama Index构建RAG应用(Datawhale AI 夏令营)

前言 Hello,大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者,本文参与活动是2024 DataWhale AI夏令营;😲 在本文中作者将通过: Gradio、Streamlit和LlamaIndex介绍 LlamaIndex 构…

jenkins 使用教程

1. 安装最新长期稳定版 2.426.1 Redhat Jenkins Packages sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key yum insta…

Linux云计算 |【第一阶段】ENGINEER-DAY2

主要内容: 磁盘空间管理fdisk、parted工具、开机自动挂载、文件系统、交换空间 KVM虚拟化 实操前骤: 1)添加一块硬盘(磁盘),需要关机才能进行操作,点击左下角【添加硬件】 2)选择2…

如何成为学习高手

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 所有的学习方式,核心都是动脑加动手。 区别在于如何让…

配置RIPv2的认证

目录 一、配置IP地址、默认网关、启用端口 1. 路由器R1 2. 路由器R2 3. 路由器R3 4. Server1 5. Server2 二、搭建RIPv2网络 1. R1配置RIPv2 2. R2配置RIPv2 3. Server1 ping Server2 4. Server2 ping Server1 三、模拟网络攻击,为R3配置RIPv2 四、在R…

【机器学习】智能驱动未来:机器学习在能源效率提升与环境管理中的创新应用

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀目录 🔍1. 引言📒2. 机器学习能源环境领域的应用潜力🌄能源效率提升🏞️环境管理⛰️具体案例…

Flink History Server配置

目录 问题复现 History Server配置 HADOOP_CLASSPATH配置 History Server配置 问题修复 启动flink集群 启动Histroty Server 问题复现 在bigdata111上执行如下命令开启socket: nc -lk 9999 如图: 在bigdata111上执行如下命令运行flink应用程序 …

【Java】用队列实现栈 力扣

文章目录 题目链接题目描述思路代码 题目链接 225.用队列实现栈 题目描述 思路 一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。 代码 class MyStack {Q…

用EXCEL和python 计算马尔可夫链转移矩阵

目录 目标:用EXCEL和python 计算马尔可夫链转移矩阵 1 用EXCEL计算 1.1 马尔可夫链的基本应用 1.2 具体计算 2 用python计算马尔可夫转移矩阵 2.1 py代码 2.2 运行结果 3 上面2者计算结果相同 目标:用EXCEL和python 计算马尔可夫链转移矩阵 1 用…

神经网络模型实现(训练、测试)

目录 一、神经网络骨架:二、卷积操作:三、卷积层:四、池化层:五、激活函数(以ReLU为例):六、模型搭建:七、损失函数、梯度下降:八、模型保存与加载:九、模型训…

Leetcode2160. 拆分数位后四位数字的最小和:

问题描述: 给你一个四位 正 整数 num 。请你使用 num 中的 数位 ,将 num 拆成两个新的整数 new1 和 new2 。new1 和 new2 中可以有 前导 0 ,且 num 中 所有 数位都必须使用。 比方说,给你 num 2932 ,你拥有的数位包括…

AP ERP与汉得SRM系统集成案例(制药行业)

一、项目环境 江西某医药集团公司,是一家以医药产业为主营、资本经营为平台的大型民营企业集团。公司成立迄今,企业经营一直呈现稳健、快速发展的态势, 2008 年排名中国医药百强企业前 20 强,2009年集团总销售额约38亿元人民币…

(秋招复习)自动驾驶与机器人中的SLAM技术(一)

秋招复习之--自动驾驶与机器人中的SLAM技术1 前言第一章 自动驾驶基础知识第二章 基础数学知识回顾旋转的表示SO(3)的BCH近似运动学表示线速度与加速度的处理一些常见的雅可比滤波器和最优化理论 第三章 惯性导航与组合导航IMU系统运动学IMU航迹推算卫星导航基于ESKF的简单组合…

PostgreSQL的引号、数据类型转换和数据类型

一、单引号和双引号(重要): 1、在mysql没啥区别 2、在pgsql中,实际字符串用单引号,双引号相当于mysql的,用来包含关键字; -- 单引号,表示user_name的字符串实际值 insert into t_user(user_nam…

【springboot】中使用--WebMvcConfigurer

WebMvcConfigurer 一、页面跳转控制器step1:创建视图,resources/templates/index.htmlstep2:创建SpringMVC配置类step3:测试功能 二、数据格式化step1:创建 DeviceInfo 数据类step2:自定义 Formatterstep3: 登记自定义的 DeviceFormatterstep4: 新建 Con…