分代回收工作流程

news2024/11/19 1:27:35

GC回收算法之分代回收

GC回收垃圾主要有三个算法,分别是标记清除,复制算法以及标记整理。

三种算法各有优缺点,其中标记清除的优点就是简单高效,缺点就是很容易带来内存碎片化问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j7qokV3p-1684413023839)(F:\typora插图\image-20230518195821774.png)]

复制算法的话,优点确实解决了内存碎片化问题,但是同时也带来了空间利用率不高,当垃圾少,有效对象多时,效率比较低的问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GP1FUmH2-1684413023841)(F:\typora插图\image-20230518200109612.png)]

标记整理的话,优点是解决了空间利用率的问题,缺点是还是没解决效率问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6sW7dfJC-1684413023842)(F:\typora插图\image-20230518200254029.png)]

而分代回收则是基于上述三种回收算法的一种复合回收策略,将垃圾回收分成不同的场景,不同的场景应用不同的回收算法。下边则是对分代回收工作过程的梳理。

1.分代规则

这里是根据Java对象生命周期的长短进行划分(以老为尊),这里给对象引入了一个概念——年龄,年龄就是对象熬过GC的轮次,这句话怎么理解呢,其实就是对象经过GC可达性遍历分析当前对象还被确定为可达的轮数。

GC主要是针对堆来讲的,这里的分代将堆划分成了几个区域,分别是伊甸区、幸存区以及老年区。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tKYppziS-1684413023842)(F:\typora插图\image-20230518201708617.png)]

其中这里的两个幸存区大小是1:1的。

2.工作流程

刚new出来的,年龄是0的对象,放到伊甸区。

熬过一轮GC,对象就放到幸存区,这里放的方法就使用的复制算法。根据经验规律,大部分Java对象生命周期都非常短,所以我们都认为能够放的下。

进入幸存区的对象也要经过GC的周期性考验,如果变成垃圾,就要被释放掉;如果不是垃圾,就会和其他不是垃圾的对象一同拷贝到另一个幸存区,这里使用的也是复制算法。因为这里的幸存区体积不大,存在一些空间浪费也能接受。

如果当前对象已经在两个幸存区之间拷贝很多次了,就进入老年代。老年代中的对象都是比较大的对象,生命周期普遍长。

多次了,就进入老年代。老年代中的对象都是比较大的对象,生命周期普遍长。

进入老年区的对象也要经过GC的周期性扫描,但是频率更低了。如果老年代的对象是垃圾了,就使用标记整理的方式进行释放。

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

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

相关文章

springcloud-alibaba (02)nacos学习笔记

nacos 一,介绍1. 什么是Spring Cloud Alibaba Nacos2. Nacos的特点和优势 二,安装和配置三,创建项目第一步,创建父工程第二步,创建基础公共模块第三步,创建服务模块第四步,开启多个实例 四&…

用Python进行AB测试之T检验的案例学习【文末源码地址】

文章目录 案例背景假设检验解读一、提出假设二、检验统计量三、代码实现四、结论 源码地址 案例背景 产品经理对APP做了许多改动,想要通过AB测试评估一下改动后的效果如何? 其中有一项评估是:签到按钮从蓝色改为红色后,客户点击…

Java 成员变量与局部变量有什么区别?

节选自JavaGuide(Github 标星 134k star!「Java学习 + 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识) 语法形式:从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符…

Smart HTML Elements Crack

Smart HTML Elements Crack Smart HTML Elements是一个现代的Vanilla JS和ES6库以及下一代前端框架。企业级Web组件包括可访问性功能(WAI-ARIA,第508/WTAG法规遵从性)、本地化、从右到左键盘导航和主题化。与Angular、ReactJS、Vue.js、Bootstrap、Meteor和任何其他…

vue编写组件 根据指定日期获取一周内所有 日期与农历日期展示 并标记当天

首先 我们要引入一下对应的第三方依赖 npm install --save chinese-lunar-calendar sass sass-loader这里 我们需要 chinese-lunar-calendar 将日期变成农历日期的工具 sass是因为 我这里为了方便 用了 sass写样式 组件代码如下 <template><headerclass "ske…

学习自动化这3个坏习惯要你命,90%测试人躺枪!

将自动化测试当成很了不起的资本&#xff0c;源于国内对Coding的崇拜 盲目的学习自动化&#xff0c;不光对你的工作没有帮助&#xff0c;可能对你的测试之路还会起反作用&#xff01; 1,为什么说盲目学习自动化可能会让你一无是处&#xff1f; 没有全面理解软件测试的基本原理…

让自己再认识一下分区吧

在上个博客中&#xff0c;我们讨论了复制 —— 即数据在不同节点上的副本&#xff0c;对于非常大的数据集&#xff0c;或非常高的吞吐量&#xff0c;仅仅进行复制是不够的&#xff1a;我们需要将数据进行 分区&#xff08;partitions&#xff09;&#xff0c;也称为 分片&#…

【Proteus仿真】| 51单片机——MAX7219 驱动数码管

系列文章 todo: 文章目录 前言1. 简单了解MAX72191.1 引脚说明1.2 寄存器说明1.2.1 选位寄存器1.2.2 BCD译码器设置寄存器1.2.3 亮度寄存器1.2.4 扫描限制寄存器1.2.5 显示测试寄存器1.2.6 关停寄存器 1.3 spi总线通信时序1.4 数据格式 2. 使用MAX7219驱动数码管2.1 驱动数码管…

【2023/05/18】TPU

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第13天。 Share The waterfall sings,"I find my song,when I find my freedom." 译文&#xff1a; 瀑布歌唱到&#xff1a;“我得到自由时便有了歌声。” I cannot tell why this heart la…

精彩直击 | 迅镭激光参展CIBF2023年电池技术盛会

5月16日&#xff0c;全球规模最大的电池、能源行业盛会——CIBF2023第十五届中国国际电池技术展览会(以下简称2023CIBF电池展)&#xff0c;在深圳国际会展中心(宝安新馆)隆重开幕! 迅镭激光携一系列新能源自动化解决方案亮相9T263展位&#xff0c;与客户分享创新技术及自动化产…

【Jmeter第四章】Jmeter添加断言(捕捉自定义错误信息)

文章目录 1、断言介绍2、Jmeter使用断言3、效果展示 1、断言介绍 前言&#xff1a;关于Jmeter中的断言&#xff0c;其实可以理解为对返回信息&#xff0c;返回代码的一种处理&#xff0c; 因为对应HTTP状态200而言&#xff0c;但我们会定义不同的返回值&#xff0c;例如 code…

【数据结构<顺序表>】C语言

前言 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条…

linux swap交换区满了怎么办(已解决)

swap交换区满了怎么办 一、不增加交换区的方法 free -m 或free -h查看占用情况 使用如下指令来查看占用swap的前十进程 for i in $( cd /proc;ls |grep "^[0-9]"|awk $0 >100) ;do awk /Swap:/{aa$2}END{print "$i",a/1024"M"} /proc/$i…

仓库信息管理系统设计与实现

一、数据库设计 1.数据库模型设计概览 2.数据库表设计 ①depository 描述&#xff1a; 该表存储仓库的信息&#xff0c;比如仓库名称&#xff0c;仓库地址和仓库介绍 表结构&#xff1a; 序号 字段名 数据类型 主键 非空 默认值 描述 1 id INT(10) 是 是 2…

LlamaIndex 联合创始人下场揭秘:如何使用私有数据提升 LLM 的能力?

ChatGPT 的爆火证明了大型语言模型&#xff08;LLM&#xff09;在生成知识和推理方面的能力。不过&#xff0c;ChatGPT 是使用公共数据集进行预训练的模型&#xff0c;因此可能无法提供与用户业务相关的特定答案或结果。 那么&#xff0c;如何使用私有数据最大化发挥 LLM 的能力…

SpringMVC第三阶段:源码解析SpringMVC如何调用Controller目标方法

源码解析SpringMVC如何调用Controller目标方法&#xff1a; 浏览器如何访问到Controller目标方法. 1、所有请求进入时候,会先进入org.springframework.web.servlet.DispatcherServlet前端控制器的doDispatch() 方法 2 、在 1016 行 getHandler() 方法中,会通过请求的资源路径…

【51单片机】万年历功能的数字时钟+倒计时 Proteus仿真 普中板子可用

// 硬件&#xff1a;DS1302、按键、LCD1602、无源蜂鸣器 // 1、具有万年历功能的数字时钟 (本世纪100年通用)&#xff0c;能够正确的显示年、月、日、时、分、秒 // 2、按键设置时间(校时) // 3、24小时内至少可设置3个闹钟&#xff0c;并具有不同的闹钟铃声。每个闹钟可以选择…

[链表OJ题 7] 环形链表

目录 题目来源&#xff1a; 代码实现&#xff1a; 思路分析&#xff1a; 实现过程&#xff1a; 题目来源&#xff1a; 力扣 141. 环形链表 题目描述 代码实现&#xff1a; bool hasCycle(struct ListNode* head) {struct ListNode* fast head, * slow head;while (fas…

为什么更新了 DNS 记录不生效?

我们在上网时如果想要访问到另一台机器上的内容&#xff0c;通常只需要直接输入一串地址&#xff0c;例如&#xff1a;www.upyun.com&#xff0c;就能够准确访问到自己想要访问的网站。但是实际上这只是方便我们记忆的字符形式网络标识&#xff0c;真正让我们的机器和另一台机器…

C语言深度解析--函数

函数 函数的定义&#xff1a; 函数&#xff0c;又称为子程序&#xff0c;是一个大型程序中的某部分代码&#xff0c;由一个或多个语句块组成。它负责完成某项特定任务&#xff0c;而且相较于其他代码&#xff0c;具备相对独立性。 一般会有输入参数并有返回值&#xff0c;提供…