jvm垃圾回收算法有哪些及原理

目录

  • 垃圾回收器
    • 1 Serial收集器
    • 2 Parallel收集器
    • 3 ParNew收集器
    • 4 CMS收集器
    • 5 G1回收器
    • 三色标记算法
      • 标记算法的过程
      • 三色标记算法缺陷
        • 多标
        • 漏标

垃圾回收器

垃圾回收机制,我们已经知道什么样的对象会成为垃圾。对象回收经历了什么——垃圾回收算法。那么谁来负责回收垃圾呢?

1 Serial收集器

-XX:+UseSerialGC -XX:+UseSerialOldGC

单线程执⾏垃圾收集,收集过程中会有较⻓的STW(stop the world),在GC时⼯作线程不能⼯作。虽然STW较⻓,但简单、直接。

新⽣代采⽤复制算法,⽼年代采⽤标记-整理算法。

在这里插入图片描述

由于Serial垃圾回收器是单线程的,因此它的优点是简单且占用资源较少;它适用于小型应用程序,例如移动应用程序和桌面应用程序。

2 Parallel收集器

-XX:+UseParallelGC,-XX:+UseParallelOldGC

使⽤多线程并行进⾏GC,会充分利⽤cpu,但是依然会有stw,这是jdk8默认使⽤的新⽣代和⽼年代的垃圾收集器。充分利⽤CPU资源,吞吐量⾼。

新⽣代采⽤复制算法,⽼年代采⽤标记-整理算法。

在这里插入图片描述

Parallel垃圾回收器适用于中等大小的应用程序,特别是那些需要高吞吐量的应用程序,例如: Web应用程序和大规模企业应用程
序。

3 ParNew收集器

-XX:+UseParNewGC

⼯作原理和Parallel收集器⼀样,都是使⽤多线程进⾏GC,但是区别在于ParNew收集器可以和CMS收集器配合⼯作。主流的方案:

ParNew收集器负责收集新生代,CMS负责收集老年代。

在这里插入图片描述

4 CMS收集器

-XX:+UseConcMarkSweepGC

⽬标:尽量减少stw的时间,提升⽤户的体验。真正做到gc线程和⽤户线程⼏乎同时⼯作。CMS采⽤标记-清除算法。

此处标记的是有用的对象。

  • 初始标记:暂停所有的其他线程(STW),并记录gc roots直接能引⽤的对象。

    例:线程栈帧的局部变量表中有个引用指向堆空间对象A,堆空间变量又引用了另一个对象B,则只记录A,不算B。

  • 并发标记:从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较⻓但是不需要STW,可以与应用线程⼀起并发运⾏。这个过程中,⽤户线程和GC线程并发,可能会有导致已经标记过的对象状态发⽣改变,所以下一步需要重新标记

    最后一句话是说会造成标记的遗漏:

    在这里插入图片描述

  • 重新标记:为了修正并发标记期间因为⽤户程序继续运⾏⽽导致标记产⽣变动的那⼀部分对象的标记记录,这个阶段的停顿时间⼀般会⽐初始标记阶段的时间稍⻓,远远比并发标记阶段时间短。主要⽤到三⾊标记⾥的算法做重新标记。

  • 并发清理:开启⽤户线程,同时GC线程开始对未标记的区域做清扫。这个阶段如果有新增对象会被标记为黑色不做任何处理。(最终被标记为白色的都是垃圾)

  • 并发重置:重置本次GC过程中的标记数据。

在这里插入图片描述

总结:

  • 这几步中,最费时间的是并发清理,所以采用了并发处理
  • 初始标记和重新标记两处采用STW形式,因为标记的速度很快
  • 重新标记采用STW模式,因为是最后一步标记,要确保标记到的必须都是用到的

5 G1回收器

用于大对象的回收,且jdk8版本对G1不是很完整

三色标记算法

标记算法的过程

再上述cms收集器中,采用到的算法就是三色标记法。

三色标记法会将内存中的对象分为白、灰、黑三种颜色,具体标记过程如下:

  1. 根据可达性分析算法,从 GC Roots 开始进行遍历访问。初始状态,所有的对象都是白色的,只有 GC Roots 是黑色的。

    在这里插入图片描述

  2. 初始标记阶段,GC Roots 标记直接关联对象置为灰色

    在这里插入图片描述

  3. 并发标记阶段,扫描整个引用链。

    • 没有子节点的话,将本节点变为黑色。

    • 有子节点的话,则当前节点变为黑色,子节点变为灰色。
      在这里插入图片描述

  4. 重复并发标记阶段,直至灰色对象没有其它子节点引用时结束。
    在这里插入图片描述
    在这里插入图片描述

扫描完成,此时黑色对象就是存活的对象,白色对象就是已消亡可回收的对象。

即(A、D、E、F、G)可达也就是存活对象,(B、C、H)不可达可回收的对象。

最终三种颜色对应的状态如下:
在这里插入图片描述

三色标记算法缺陷

三色标记算法,由于在并发标记阶段的时候,因为用户线程与 GC 线程同时运行,有可能会产生多标或者漏标

多标

假设已经遍历到 E(变为灰色了),此时应用执行了 objD.fieldE = null (D → E 的引用断开)。
在这里插入图片描述

D → E 的引用断开之后,E、F、G 三个对象不可达,应该要被回收的。然而因为 E 已经变为灰色了,其仍会被当作存活对象继续遍历下去。最终的结果是:这部分对象仍会被标记为存活,即本轮 GC 不会回收这部分内存。

这部分本应该回收但是没有回收到的内存,被称之为浮动垃圾。浮动垃圾并不会影响应用程序的正确性,只是需要等到下一轮垃圾回收中才被清除。

另外,针对并发标记开始后的新对象,通常的做法是直接全部当成黑色,本轮不会进行清除。这部分对象期间可能会变为垃圾,这也算是浮动垃圾的一部分。

漏标

假设 GC 线程已经遍历到 E(变为灰色了),此时应用线程先执行了:

var G = objE.fieldG; objE.fieldG = null; // 灰色E 断开引用 白色G objD.fieldG = G; // 黑色D 引用 白色G

在这里插入图片描述

此时切回到 GC 线程,因为 E 已经没有对 G 的引用了,所以不会将 G 置为灰色;尽管因为 D 重新引用了 G,但因为 D 已经是黑色了,不会再重新做遍历处理。

最终导致的结果是:G 会一直是白色,最后被当作垃圾进行清除。这直接影响到了应用程序的正确性,是不可接受的。

漏标只有同时满足以下两个条件时才会发生:

  • 一个或者多个黑色对象重新引用了白色对象;即黑色对象成员变量增加了新的引用。
  • 灰色对象断开了白色对象的引用(直接或间接的引用);即灰色对象原来成员变量的引用发生了变化。

也有方法可以解决:

需要在上面三个步骤中任意一个中,将对象 G 记录起来,然后作为灰色对象再进行遍历即可。比如放到一个特定的集合,等初始的 GC Roots 遍历完(并发标记),再重新标记阶段对该集合的对象遍历即可(重新标记)。

var G = objE.fieldG; // 1.读objE.fieldG = null; // 2.写objD.fieldG = G; // 3.写

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

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

相关文章

NPDP产品经理证书是什么行业的证书?

NPDP是一个跨行业的证书,它适用于各种不同类型和规模的组织。无论是制造业、服务业还是科技领域,都可以从NPDP认证中获益。 1. 制造业: 制造业涉及大量的产品开发和创新活动。从汽车制造到电子设备制造,从家居用品到航天航空&…

当数据库遇上深度学习:AI DataLoader 助力因子管理模型训练全流程

深度学习模型有能力自动发现变量之间的关系,而这些关系通常是不可见的,这使得深度学习可以挖掘新的因子和规律,为量化投资策略提供更多可能性。在传统的量化策略开发流程中,通常会使用 Python 或第三方工具生成因子,并…

JVM | 命令行诊断与调优 jhsdb jmap jstat jps

目录 jmap 查看堆使用情况 查看类列表,包含实例数、占用内存大小 生成jvm的堆转储快照dump文件 jstat 查看gc的信息,查看gc的次数,及时间 查看VM内存中三代(young/old/perm)对象的使用和占用大小 查看元数据空…

为“数字盲道”修“护栏”,隐语YACL护航无障碍数字服务隐私安全

“隐语”是开源的可信隐私计算框架,内置 MPC、TEE、同态等多种密态计算虚拟设备供灵活选择,提供丰富的联邦学习算法和差分隐私机制 开源项目:github.com/secretflowgitee.com/secretflow 10月19日,杭州第4届亚洲残疾人运动会火炬…

安装好cuda后解决torch.cuda.device_count() == 0

更新显卡驱动可以安装高版本的cuda 可以通过打开cmd输入nvidia-smi来查看 所以说不高于12.3的版本都可以安装 cuda版本匹配pytorch版本 打开网址:https://pytorch.org/ 验证完后,就可以吭哧吭哧的去下载安装了 搞完后还是发型代码跑出来GPU 0 不要…

Zookeeper、Kafka集群与Filebeat+Kafka+ELK架构、部署实例

Zookeeper、Kafka集群与FilebeatKafkaELK架构、部署实例 一、Zookeeper1.1、Zookeeper 定义1.2、Zookeeper 工作机制1.3、Zookeeper 特点1.4、Zookeeper 数据结构1.5、Zookeeper 应用场景1.5、Zookeeper 选举机制1.5.1、 第一次启动选举机制1.5.2、 非第一次启动选举机制 二、Z…

SpringMVC系列-5 消息转换器

背景 SpringMVC系列的第五篇介绍消息转换器,本文讨论的消息转换指代调用Controller接口后,对结果进行转换处理的过程。 内容包括介绍自定义消息转换器、SpringMVC常见的消息转换器、Spring消息转换器工作原理等三部分。 本文以 SpringMVC系列-2 HTTP请求…

基于机器学习与大数据的糖尿病预测 计算机竞赛

文章目录 1 前言1 课题背景2 数据导入处理3 数据可视化分析4 特征选择4.1 通过相关性进行筛选4.2 多重共线性4.3 RFE(递归特征消除法)4.4 正则化 5 机器学习模型建立与评价5.1 评价方式的选择5.2 模型的建立与评价5.3 模型参数调优5.4 将调参过后的模型重…

Mac风扇控制电脑降温软件Macs Fan Control Pro 简体中文

Macs Fan Control Pro是一款功能强大的Mac风扇控制软件,旨在帮助用户更好地管理和控制Mac电脑的风扇速度和温度传感器。以下是该软件的主要特色介绍: 监测和调整Mac电脑的风扇速度和温度传感器,帮助用户控制设备温度,提高电脑性能…

PyTorch基础(18)-- torch.stack()方法

一、方法详解 首先,看一下stack的直观解释,动词可以简单理解为:把……放成一堆、把……放成一摞。 有了对stack方法的直观感受,接下来,我们正式解析torch.stack方法。 PyTorch torch.stack() method joins (concaten…

每日汇评:黄金形态确认牛市,再次尝试上行2000美元

金价挑战1988美元的关键阻力位,向2000美元进发; 在避险情绪中,美元随着美债收益率扩大复苏; 黄金价格在日线图上确认了一个多头标志,RSI指数仍然指向更多的上涨; 随着中东紧张局势再次引起人们的关注&#…

《动手学深度学习 Pytorch版》 10.1 注意力提示

10.1.1 生物学中的注意力提示 “美国心理学之父” 威廉詹姆斯提出的双组件(two-component)框架: 非自主性提示:基于环境中物体的突出性和易见性 自主性提示:受到了认知和意识的控制 10.1.2 查询、键和值 注意力机制…

个人记账理财软件 Money Pro mac中文版软件介绍

Money Pro for mac是一款综合性高的理财工具,Money Pro是一套能够协同工作的工具,可用来追踪账户、管理账单以及制作预算,您可以为每个时间段设置不同的预算限值。财务一切尽在掌控之中。 Money Pro for mac软件介绍 Money Pro for mac提供一…

【QT】对象树

一、QT对象树的概念 先来看一下 QObject 的构造函数: 通过帮助文档我们可以看到,QObject 的构造函数中会传入一个 Parent 父对象指针,children() 函数返回 QObjectList。即每一个 QObject 对象有且仅有一个父对象,但可以有很多个…

【JavaSE语法】数据类型与变量

一、字面常量 常量即程序运行期间,固定不变,不可修改的量称为常量 public class Demo {public static void main(String[] args) {System.out.println("hello World!");System.out.println(100);System.out.println(3.14);System.out.println(A);System…

PLC、触摸屏、上位机之间如何实现无线数据交互功能?

本文以组态王与西门子触摸屏和2台西门子S7-200SMART为例,介绍组态王、触摸屏与多台 PLC在Profinet协议下的自组网无线通信实现过程。在本方案中采用了西门子PLC无线通讯终端——DTD418M,作为实现无线通讯的硬件设备。我们无需更改网络参数和原有程序&…

CANoe-使用IG Ethernet Packet Builder实现IP包分片的若干问题

在文章《CANoe-Ethernet IG和Ethernet Packet Builder的使用和区别》中,我们讲过Packet Builder可以组装多种类型的以太网报文: 当我们想组装一条icmpv4 echo request报文,payload只有1个字节的数据FF时,选择ICMPv4 Packet,创建一条ICMPv4报文,把payload改为1个字节: 然…

[开源]一个低代码引擎,支持在线实时构建低码平台,支持二次开发

一、开源项目简介 TinyEngine低代码引擎使能开发者定制低代码平台,支持在线实时构建低码平台,支持二次开发或集成低码平台能力。 二、开源协议 使用MIT开源协议 三、界面展示 四、功能概述 TinyEngine是一个低代码引擎,基于这个引擎可以构…

腾讯云轻量应用服务器性能差吗?为什么便宜?

腾讯云轻量应用服务器性能如何?为什么便宜是不是性能不行?腾讯云百科txybk.com从轻量应用服务器的CPU型号、处理器主频、内存、公网带宽、月流量和系统盘多方面来详细测评轻量性能,轻量应用服务器性价比高,并不是性能不行&#xf…

react native 使用夜神模拟器开发调试 windows+android

执行adb devices, 提示List of devices attached 打开本地sdk目录中的platform-tools文件夹,复制下面3个文件 打开夜神模拟器安装目录中的bin目录,把复制出来的文件复制替换到bin目录中 在复制一份platform-tools目录中的adb.exe,重命名为…