Golang 垃圾回收

庆云2年前技术文章594

1、标记清除算法

Golang 使用标记清除算法作为垃圾回收器的一部分。标记清除算法是一种常见的垃圾回收算法,它通过标记和清除未被引用的对象来回收内存空间。

Golang 中,垃圾回收器会定期扫描堆空间,并找出哪些对象没有被引用。如果一个对象没有被引用,那么它就是垃圾,垃圾回收器会将其回收并释放相应的内存空间。

1.1 标记清除算法阶段

标记清除算法主要分为两个阶段:标记阶段和清除阶段

  1. 标记阶段,垃圾回收器会遍历堆中的所有对象,并标记每个对象是否被引用。这个过程是通过将对象的标记位设置为 1 来完成的。如果一个对象没有被标记,则说明它没有被引用,需要被回收。

  2. 清除阶段,垃圾回收器会清除所有未被标记的对象,并释放相应的内存空间。

1.png

1.2 标记清除算法步骤

在 Golang 中,标记清除算法的具体实现包括以下步骤:

  1. 垃圾回收器会从根对象开始遍历整个对象树,并标记每个对象是否被引用。

  2. 所有被标记的对象会被复制到新的堆空间中,未被标记的对象则会被回收。

  3. 清除阶段会扫描整个堆空间,并释放未被标记的对象所占用的内存空间。

  4. 释放完成后,垃圾回收器会将新的堆空间与旧的堆空间交换,使新的堆空间成为当前的堆空间。


需要注意的是,标记清除算法可能会导致内存碎片化问题。因为被回收的对象并不一定是连续的,所以空闲的内存空间可能会被切割成多个小块。为了解决这个问题,Golang 采用了复制算法和标记整理算法。

2、标记复制算法

复制算法是将堆空间分为两个相等的区域,每次只使用其中一个区域,当这个区域用尽时,将存活的对象复制到另一个区域中,并释放原来的空间。这个过程会使得内存空间连续,但需要额外的空间用于复制对象。

2.png

3、标记整理算法

标记整理算法则是在标记和清除阶段之后,将所有存活的对象移动到堆空间的一端,而未被引用的对象则会被移动到堆空间的另一端。这个过程会使得空闲的内存空间变得连续。

3.png





相关文章

MySQL 闪回技术总结

MySQL 闪回技术总结

一、闪回技术汇总1. 第一类为以 patch 形式集成到官方工具 mysqlbinlog 中,阿里彭立勋 2012 年曾提交过相关工具;2. 第二类是独立工具,通过伪装 Slave 拉取 Binlog...

MySQL 8.0 新特性:Clone Plugin

MySQL 8.0 新特性:Clone Plugin

一、前言MySQL 在 8.0.17 加入了克隆插件,可以从本地或者远程克隆数据,比如需要创建主从关系,我们一般都是通过物理备份来做,那如果你使用的是 MySQL 8.0.17 及以上的版本那么就可以...

hdfs短路读

hdfs短路读

原理当客户端执行数据块副本短路读时,Client与DataNode的交互过程具体如下图:含义如下:(1)DFSClient通过requestShortCircuitShm()接口向DataNode请求...

查看 Redis 不过期 key

查看 Redis 不过期 key

一、使用 Rdbtools 工具包使用 Rdbtools 工具包通过分析备份 rdb 文件,可以查看期间大 key 情况及过期时间情况。输出 csv 文档列信息情况详见下方附件--安装 rdb 工具包...

Oozie web console is disabled 问题解决

Oozie web console is disabled 问题解决

一、问题一a、错误现象b、解决方案①、根据提示查看Oozie Quick Start 发现是缺少ExtJS 2.2库(必须是2.2版)下载ExtJS2.2下载地址:http://archive.clo...

Flink部署

安装前准备1.1. 添加环境变量vi /etc/profile export FLINK_HOME=/opt/flinkexport PATH=$PATH:$FLINK_HOME/bin source...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。