《JVM第8课》垃圾回收算法
文章目录
- 1.标记算法
- 1.1 引用计数法
- 1.2 可达性分析法
- 2.回收算法
- 2.1 标记-清除算法(Mark-Sweep)
- 2.2 复制算法(Coping)
- 2.3 标记-整理算法(Mark-Compact)
- 3.三种垃圾回收算法的对比
为什么要进行垃圾回收?
垃圾是指 JVM 中没有任何引用指向它的对象,如果不及时清理这些垃圾对象,那么它就会一直占用内存,如果垃圾对象越来越多,就会出现OOM了。
要判断对象是否是垃圾对象有两种方式,一、引用计数法。二、可达性分析法。
而要清除垃圾对象有三种常用方式,一、标记-清除算法。二、复制算法。三、标记-整理算法。
1.标记算法
要清除垃圾首先要找到垃圾,JVM是通过什么算法找到堆中的垃圾对象的呢?
1.1 引用计数法
每个对象都保存一个引用计数器属性,用于记录对象被引用的次数。如果计数器为 0 则表示是垃圾对象。
优点:原理简单,计数器为 0 则表示是垃圾对象。
缺点:
- 需要额外的空间和时间来维护引用计数。
- (严重) 无法处理循环引用的问题。
循环引用就是A对象里有个B对象的属性,B对象里有个A对象的属性,这样的话A和B的引用计数器都会等于1,永远不会被回收。所以引用计数法很少使用!!!
1.2 可达性分析法
可达性分析法会以GC Roots作为起始点,然后一层一层的去寻找引用的对象,被找到的对象就是存活对象,无法到达的对象就是垃圾对象。

GC Roots是一组引用,基本常用的包括:
- 线程的虚拟机栈的栈帧中的方法参数、局部变量所对应的对象引用
- 线程的本地方法栈的栈帧中的方法参数、局部变量所对应的对象引用
- 方法区中保存的类信息中静态属性、常量属性所对应的对象引用
2.回收算法
2.1 标记-清除算法(Mark-Sweep)
既然我们已经能够找到哪些是垃圾对象,那么我们该怎么去回收这些垃圾对象呢?这里又涉及到一些算法,首先比较简单的就是标记-清除算法。
标记-清除算法是一种非常基础的垃圾回收算法,针对某块内存空间,比如新生代、老年代,如果可用内存不足后,就会STW(暂停用户线程的执行),然后执行算法进行垃圾回收:
- 标记阶段:从 GC Roots 开始遍历,找到可达对象,并在对象头中进行记录。
- 清除阶段:堆内存空间进行线性遍历,如果发现对象头中没有记录是可达对象,则回收它。

缺点:
- 效率不高,和后面讲的算法来比效率确实不高。
- 内存碎片,对象被清除后会留下一块一块的小内存,由于这些小内存不是连续的,所以很可能不够存储新来的大对象。
优点:
- 思路简单。
2.2 复制算法(Coping)
复制算法的思想就是空间换时间。它将内存空间分为两块,每次只使用一块,在进行垃圾回收时,会首先STW,然后遍历将可达对象复制到另外没有被使用的内存块中,然后再将当前内存块标记为可重用,后续再按相同的流程进行垃圾回收,两块内存交换着来。这也是为什么新生代中会有 S1 和 S2 两块内存区域的原因。

复制算法只遍历一次,在遍历的同时就把可达对象复制到另一块内存中,而标记-清除算法需要遍历两次,标记和清除各一次。
优点:
- 只遍历一次,效率高。
- 不会出现内存碎片。
缺点:
- 需要更多的内存,始终有一半的空闲内存。
- 对象复制后,对象的内存地址发生了变化,需要额外的时间修改栈帧中记录的引用地址。
- 如果可达对象比较多,垃圾对象比较少,那么复制算法的效率就会比较低,所以新生代特别适合复制算法,因为新生代的垃圾对象比较多(但也不绝对)。
2.3 标记-整理算法(Mark-Compact)
第一阶段和标记-清除算法一致,也是标记可达对象,也会STW。
第二阶段将所有存活对象移动到内存的一端。
最后清理边界外的所有空间

优点:
- 不会出现内存碎片。
- 也不需要利用额外的内存空间。
缺点:
- 效率要低于标记清除算法、复制算法。
- 也需要修改栈帧中的引用地址。
3.三种垃圾回收算法的对比
| 标记-清除 | 标记-整理 | 复制 | |
|---|---|---|---|
| 速度 | 中等 | 最慢 | 最快 |
| 空间开销 | 少(有碎片) | 少(无碎片) | 最多 |
| 移动对象 | 否 | 是 | 是 |
相关文章:
《JVM第8课》垃圾回收算法
文章目录 1.标记算法1.1 引用计数法1.2 可达性分析法 2.回收算法2.1 标记-清除算法(Mark-Sweep)2.2 复制算法(Coping)2.3 标记-整理算法(Mark-Compact) 3.三种垃圾回收算法的对比 为什么要进行垃圾回收&…...
SpringBoot整合Freemarker(二)
if分支 语法: <#if condition>... <#elseif condition2>... <#elseif condition3>... <#else>... </#if> 例子: <#if x 1>x is 1 </#if> --------------------------------- <#if x 1>x is 1 <…...
element plus el-form自定义验证输入框为纯数字函数
element plus 的el-form 使用自定义验证器,验证纯数字,禁止输入小数、中文、字母、特殊符号。input的maxlength为最大输入多少位长度 效果图 <el-form ref"dataFormRef" :model"dataForm" :rules"dataRules" label-w…...
Android笔记(三十一):Deeplink失效问题
背景 通过deeplink启动应用之后,没关闭应用的情况下,再次使用deeplink会失效的问题,是系统bug导致的。此bug仅在某些设备(Nexus 5X)上重现,launchMode并且仅当应用程序最初通过深层链接启动并再次通过深层…...
图神经网络初步实验
实验复现来源 https://zhuanlan.zhihu.com/p/603486955 该文章主要解决问题: 1.加深对图神经网络数据集的理解 2.加深对图神经网络模型中喂数据中维度变化的理解 原理问题在另一篇文章分析: 介绍数据集:cora数据集 其中的主要内容表示为…...
创建线程时传递参数给线程
在C中,可以使用 std::thread 来创建和管理线程,同时可以通过几种方式将参数传递给线程函数。这些方法包括使用值传递、引用传递和指针传递。下面将对这些方法进行详细讲解并给出相应的代码示例。 1. 值传递参数 当你创建线程并希望传递参数时ÿ…...
兴业严选|美国总统都是不良资产出身 法拍市场是否将大众化
北京时间11月6日,特朗普赢得美国大选。 说起特朗普那就不得不提他的发家史,那可真是一笔笔不良资产投资堆出来的。 没错,特朗普就是处理不良资产的高手,战果丰硕。 改造斯威夫特小镇、 康莫德酒店、打造特朗普(TRUM…...
C#-拓展方法
概念:为现有的非静态变量类型,添加方法 语法: 访问修饰符 static 返回值 函数名(this 拓展类名 参数名, 参数类型 参数名,参数类型 参数名....){} 而public static void F(this Console()){ }是错的。Console是静态类不可以为静态类添加方…...
加锁失效,非锁之过,加之错也|京东零售供应链库存研发实践
本文导读 从事京东零售供应链库存业务,库存数量操作增减十分频繁,并且项目开发中会常常遇到各种并发情况,一旦库存数量操作有误,势必给前台销售产生损失影响,因此需要关注对库存数量并发操作下的一致性问题。 大部分…...
vue3 传值的几种方式
一.父组件传子组件 父组件 //父组件 <Decisionobject :Decisionselected"Decisionselected"></Decisionobject> <script lang"ts" setup> let Decisionselected ref(false); </script>子组件 <script lang"ts" s…...
AUTOSAR CP NVRAM Manager规范导读
一、NVRAM Manager功能概述 NVRAM Manager是AUTOSAR(AUTomotive Open System ARchitecture)框架中的一个模块,负责管理非易失性随机访问存储器(NVRAM)。它提供了一组服务和API,用于在汽车环境中存储、维护和恢复NV数据。以下是NVRAM Manager的一些关键功能: 数据存储和…...
2024阿里云CTF Web writeup
《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect 前言 又是周末…...
软件著作权申请教程(超详细)(2024新版)软著申请
目录 一、注册账号与实名登记 二、材料准备 三、申请步骤 1.办理身份 2.软件申请信息 3.软件开发信息 4.软件功能与特点 5.填报完成 一、注册账号与实名登记 首先我们需要在官网里面注册一个账号,并且完成实名认证,一般是注册【个人】的身份。中…...
三维测量与建模笔记 - 3.2 直接线性变换法标定DLT
DLT - Direct Linear Transform 上图中,透视成像对应的公式是共线方程,可以参考以下链接: https://zhuanlan.zhihu.com/p/101549821https://zhuanlan.zhihu.com/p/101549821 对于标定来说,需要找到。已知量是。 (u,v)是…...
Whisper AI视频(音频)转文本
在信息化时代,如何高效处理丰富的音频和视频内容成为了一个重要课题。将这些内容转化为文本不仅能提高信息的可获取性,还能促进更广泛的传播。Whisper Desktop作为一款先进的语音识别工具,能够帮助用户轻松实现音频和视频的转文本功能。 什么…...
全网最详细RabbitMQ教学包括如何安装环境【RabbitMQ】RabbitMQ + Spring Boot集成零基础入门(基础篇)
目录 一、初始Rabbitmq1、什么是Rabbitmq,它的概述是什么?2、RabbitMQ的应用场景3、RabbitMQ主要组件4、RabbitMQ 的优点5、与其他消息队列性能比较 二、RabbitMQ环境安装初始化三、SpringAMQPRabbitMQ实战入门(基本API)1、实战入…...
esp32记录一次错误
报错信息 PS C:\XingNian\GeRen\4Gdownload\wireless-esp8266-dap> idf.py build Executing action: all (aliases: build) Running cmake in directory c:\xingnian\geren\4gdownload\wireless-esp8266-dap\build Executing "cmake -G Ninja -DPYTHON_DEPS_CHECKED1 …...
Moonshine - 新型开源ASR(语音识别)模型,体积小,速度快,比OpenAI Whisper快五倍 本地一键整合包下载
Moonshine 是由 Useful Sensors 公司推出的一系列「语音到文本(speech-to-text, STT)转换模型」,旨在为资源受限设备提供快速而准确的「自动语音识别(ASR)服务」。Moonshine 的设计特别适合于需要即时响应的应用场景&a…...
java-web-苍穹外卖-day1:软件开发步骤简化版+后端环境搭建
软件开发 感觉书本上和线上课程, 讲的太抽象, 不好理解, 但软件开发不就是为了开发应用程序吗?! 干嘛搞这么抽象,对吧, 下面个人对于软件开发的看法, 主打简单易懂, 当然,我一IT界小菜鸟, 对软件开发的认识也很浅显, 这个思维导图也仅仅是现阶段我的看法, 我以后会尽力…...
一个国产 API 开源项目,在 ProductHunt 杀疯了...
随着AI 大模型技术的兴起,全球产品更新和面市进程速度肉眼可见的加快,Product Hunt 作为全球知名的产品发现平台,每日都会精选出一系列产品能力强劲的新产品,这些产品不仅代表了技术前沿,还反映了市场的发展趋势。 上…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
