【JVM】垃圾回收机制

news2024/12/24 8:13:45

垃圾回收三大步骤:判断是不是垃圾(垃圾判断算法) -> 标记需要回收的垃圾(三色标记) -> 回收垃圾(垃圾回收算法)。

一、如何判断是不是垃圾(垃圾判断算法)?

(1)引用计数器算法:对象中记录引用次数(引用就++,引用失效--),此方式无法判断循环依赖的引用问题。

(2)可达性分析算法:将一些对象作为GC根向下搜索,无法被搜索到的说明无引用可回收。

        GC根:比如栈帧中本地变量表引用的对象、方法区静态属性或常量引用的对象、本地方法(Nativie)栈引用的对象等等。

二、如何标记需要回收的垃圾(三色标记)?

(一)三色标记四个步骤

        a. 初始标记阶段:STW,只标记GC根直接关联的对象,耗时极少。

        b. 并发标记阶段:由GC根依次向下标记所有关联的对象,可达为存活对象,不可达为可回收对象。

        c. 重新标记阶段:STW,标记新建的对象引用(GMC收集器通过读写屏障+增量更新记录新建的引用对象)。

        d. 清除标记阶段:GC线程与用户线程并发清理被标记的垃圾对象。

三色标记遍历过程
三色标记遍历过程
  • 白色:尚未被GC扫描过的对象;
  • 灰色:被CG访问过但其直接引用的对象未被访问过(不可回收,全部访问后变成黑色);
  • 黑色:被GC访问过且其直接引用的对象也全都被访问过(非垃圾对象)。

 (二)三色标记的问题

  • 多标:A→B→C,A黑B灰C白时,A→B引用断了。(不用考虑,因为下一次可能被CG)
  • 少标/漏标:A→B,A黑B黑时,突然新增了B→C。(C变成浮动垃圾了)

(少标/漏标)解决方案:

  • 读屏障+重新标记:并发结束后STW重新标记新增的引用;
  • 写屏障+增量更新:将新增的引用加入待扫描的集合中;
  • 写屏障+原始快照:引用关系变化时记录之前的引用关系快照,扫描旧的对象再次标记。

三、如何回收垃圾(垃圾回收算法)?

(一)垃圾回收的算法

  • 标记-清除算法:效率低、容易产生大量空间碎片;
  • 标记-复制算法:无碎片、但浪费一半的内存;(新生代回收算法)
  • 标记-整理算法:先标记对象,然后让存活对象向一端移动,最后清理掉存活对象边界外的内存;
  • 分代收集算法:内存划分为新生代(1/3)和老年代(2/3),新生代采用标记-复制算法,老年代采用标记-整理/清除。

 (二)分代收集算法

        新生代默认内存分配比:Enden:From:To=8:1:1

        进入老年代条件:

        (1)15次GC依旧存活的对象;

        (2)大对象:大小占Eden区的一半;

        (3)空间分配担保:检查老年代最大可用内存是否大于新生代所有对象之和,成立(未开启则Full GC)则检查老年代空间是否大于历史晋升对象的平均大小,是则Minor GC;

        (4)动态年龄判断:Survivor区(From或To)相同年龄对象的大小>Survivor区的一半,年龄大于此值的可以直接进入老年代。

        老年代和新生代之间引用的解决方案:记忆集(卡表)。

四、垃圾收集器

(一)G1垃圾收集器

G1将堆分成很多个Region,每个Region只有在使用时才会确定其唯一角色(Eden、From/To、Old区、humongous区)

回收某个region的价值大小 = 回收获得的空间大小 + 回收所需时间。

(二)ZGC垃圾收集器 

ZGC:Region分为小、中、大三种,染色指针。

染色指针:对象的三色标记状态(Marked0、Marked1)、是否进入了重分配集(Remapped)、是否需要通过 finalize 方法来访问到(Finalizable)。

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

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

相关文章

基于STM32F103C8T6的超声波测距——串口输出

文章目录 前言一、超声波模块介绍1、产品特点2、超声波模块的时序图 二、STM32CubeMx创建工程1、配置项目2、keil代码设置3、效果 三、总结四、参考资料 前言 环境: 1、硬件:stm32f103c8t6 核心板 2、软件:STM32CubeMX 6.4.0 3、软件&#xf…

进程通信管道制作

利用父子进程 创建管道利用pipe函数 // 1.创建管道int pipefd[2] {0}; //[0] 读端 &#xff0c;[1]写端int n pipe(pipefd);assert(n ! -1); // debug 在release下会裁减(void)n;//防止在release下报错cout << "fd[0]:" << pipefd[0] << endl…

多用户商城开源-多店铺商城系统平台开发

多用户商城开源是指一种基于开放源代码的电子商务平台&#xff0c;允许多个用户共享一个平台&#xff0c;每位用户可以创建自己的电子商城&#xff0c;并在平台上进行交易、管理、营销等操作。多用户商城开源通常包含多种功能&#xff0c;如商品管理、订单管理、支付集成、促销…

vue diff算法与虚拟dom知识整理(14) patchVNode处理子节点新增和删减

上文 vue diff算法与虚拟dom知识整理(13) 手写patch子节点更新换位策略 我们实现了子节点位置的更新策略 但还有一些匹配不到的情况会导致死循环 那么我们继续来优化一下 我们先将src下的 index.js 代码改成这样 import h from "./snabbdom/h"; import patch from …

Scrapy ImagesPipeline下载图片

一、 ImagesPipeline是啥 ImagesPipeline是scrapy自带的类&#xff0c;用来处理图片(爬取时将图片下载到本地)。 二、ImagesPipeline优势&#xff1a; 将下载图片转换成通用的jpg和rgb格式避免重复下载缩略图生成图片大小过滤异步下载 三、ImagesPipeline工作流程 爬取一个…

Echarts构建指定省份的地图

1. 自行准备好Echarts环境 Echarts官网&#xff1a;https://echarts.apache.org/zh/index.html 2. 下载需要的省份或者城市的json地理信息文件 下载我们需要显示地区的Json数据&#xff0c;这个Json数据用于Echart的地图显示 例如我这里是下载的&#xff1a;湖南、湖北、四川…

同步模式之顺序控制线程执行

tip: 作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 文章目录 一、同步模式之顺序控制线程执行二、代码样例三、三个线程分别输出a、b、c&#xff0c;按顺序输…

作为一个项目管理成员,怎样才能有效监控项目执行?

作为一个项目管理成员&#xff0c;有效监控项目执行是确保项目成功的关键。在项目执行期间&#xff0c;您需要密切关注项目进展&#xff0c;并及时采取行动来纠正任何偏差。以下是几个有效的方法&#xff0c;可以帮助您监控项目执行并确保项目按计划顺利进行。 1. 制定详细的项…

C语言进阶--数据的存储

目录 数据类型介绍 基本内置类型&#xff1a; 类型的意义&#xff1a; 类型的基本归纳&#xff1a; 整型在内存中的存储 原码&#xff0c;反码和补码&#xff1a; 大小端存储模式&#xff1a; 大小端产生原因&#xff1a; 浮点型在内存中的存储 数据类型介绍 基本内…

六、机械手的种类

机械手是机器人能够完成指令的一个重要输出装置&#xff0c;机器臂是否合理、有效&#xff0c;决定了机 器人能否发挥出应有的作用。 机械手是一种能模仿人手和臂的某些动作功能&#xff0c;用以按固定程序抓取、搬运物件或操作工具的自动操作装置。特点是可以通过编程来完成各…

wy的leetcode刷题记录_Day68

wy的leetcode刷题记录_Day68 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2023-6-6 前言 目录 wy的leetcode刷题记录_Day68声明前言1019. 链表中的下一个更大节点题目介绍思路代码收获 1019. 链表中的下一个更大节点 2352. 相等行列…

CPU、内存、缓存的关系

术语解释 &#xff08;1&#xff09;CPU&#xff08;Central Processing Unit&#xff09; 中央处理器 &#xff08;2&#xff09;内存 内存用于暂时存放CPU中的运算数据&#xff0c;以及与硬盘等外部存储器交换的数据。它是外存与CPU进行沟通的桥梁&#xff0c;内存的运行决定…

Docker容器管理

docker容器相当于一个进程&#xff0c;性能接近于原生&#xff0c;几乎没有损耗&#xff1b; docker容器在单台主机上支持的数量成百上千&#xff1b; 容器与容器之间相互隔离&#xff1b; 镜像是创建容器的基础&#xff0c;可以理解镜像为一个压缩包 docker容器的管理 容…

深耕电力行业,百度智能云助力电厂节煤降耗

山西省吕梁市汾阳市三泉镇&#xff0c;晋能集团旗下山西国峰煤电有限责任公司的两台300MW循环流化床直接空冷机组正在运行&#xff0c;燃煤通过传送带进入锅炉燃烧&#xff0c;将水加热成高温高压蒸汽&#xff0c;用以推动汽轮机拖动发电机旋转发电&#xff0c;支撑工业生产、点…

CW32-Template CW32F030开发板工程模板

国产MCU Embedded-CW32-Board-Template Embedded-CW32-Board-Template CW32-Template第三方资源集合 CW-Template CW32开发者开发板资料 CW32-Board 开发板资料 合集 官方提供的案例Examples CW32F030_StandardPeripheralLib\Examples CW32-48F大学计划板例程 EX1流…

优思学院|精益和六西格玛都强调的一件东西...

精益和六西格玛有着诸多不同&#xff0c;它们的方法和理念也不尽相同&#xff0c;但却有一件东西&#xff0c;是他们的共同理念和工具&#xff0c;那就是----标准。 标准&#xff0c;是企业管理中至关重要的一环。标准&#xff0c;不仅指导着我们对人、物和流程的处理方式&…

2023年鄂州中级职称水测考试什么时候考试?

今天鄂州中级职称水测考试开始打印准考证了&#xff0c;但是只能打印部分专业的水测准考证&#xff0c;按照专业&#xff0c;按照批次打印的。 具体通知如下: 各位考生&#xff1a; 为积极稳妥做好我市晋升中、初级专业技术职称综合系列水平能力测试工作&#xff0c;现按专业分…

【2023 年第十三届 MathorCup 高校数学建模挑战赛】A 题 量子计算机在信用评分卡组合优化中的应用 37页论文及代码

相关信息 &#xff08;1&#xff09;建模思路 【2023 年第十三届 MathorCup 高校数学建模挑战赛】A 题 量子计算机在信用评分卡组合优化中的应用 详细建模过程解析及代码实现 【2023 年第十三届 MathorCup 高校数学建模挑战赛】 B 题 城市轨道交通列车时刻表优化问题 详细建…

2023BR软件、Adobe Bridge下载、安装教程

最后附下载地址 Adobe Bridge CS5 软件是一款功能强大的媒体管理器&#xff0c;它允许您集中访问所有创作资源。 功能介绍 1、可以方便地访问本地PSD、AI、INDD 和 Adobe PDF 文件以及其它 Adobe 和非 Adobe 应用程序文件。 2、可以将资源按照需要拖移到版面中进行预览&…

安卓平台下的即时通讯技术深入解析【实时聊天应用开发实战】

摘要: 本文将详细介绍如何使用安卓开发技术实现一个实时聊天应用。我们将通过构建一个基于安卓平台的聊天应用,演示如何处理用户注册、登录、消息发送和接收等关键功能。文章将涵盖安卓开发的各个方面,包括用户界面设计、后端服务器搭建、网络通信、数据存储和安全性等。读…