Golang 垃圾回收

庆云2年前技术文章1023

1、标记清除算法

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

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

1.1 标记清除算法阶段

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

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

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

1.png

1.2 标记清除算法步骤

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

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

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

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

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


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

2、标记复制算法

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

2.png

3、标记整理算法

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

3.png





相关文章

数据湖技术之iceberg(一)数据湖的概念

数据湖技术之iceberg(一)数据湖的概念

1  数据湖概念1.1.  什么是数据湖数据湖是一个集中式的存储库,允许你以任意规模存储多个来源、所有结构化和非结构化数据,可以按照原样存储数据,无需对数据进行结构化处理,并运行不...

可持续集成工具

可持续集成工具

持续集成中常用的 Jenkins 替代方案。1BuildMaster项目地址:https://inedo.com/buildmasterInedo 的 BuildMaster 是 Jenkins 替代...

数仓主流架构简介之二

数仓主流架构简介之二

一、流批一体数据批流一体是一种云计算架构模式,它结合了批处理和流处理的特点,以实现更高效、灵活和可扩展的数据处理能力。在这种模式下,数据可以同时进行批处理和流处理,以满足不同场景下的需求流批一体:是指...

使用impala操作kudu

使用impala操作kudu

登录impala-shell,创建impala_kudu数据库。1、创建表CREATE TABLE student ( id int not null, name STRING null ,...

数据湖技术之iceberg(三)Iceberg数据存储格式

数据湖技术之iceberg(三)Iceberg数据存储格式

1  Iceberg数据存储格式1.1.  Iceberg术语l   data files(数据文件):数据文件是Apache Iceberg表真实存储数据的文...

CDH实操--CDH集成Trino(三)

CDH实操--CDH集成Trino(三)

1、将parcel包放到对应下载目录将parcel包放到/var/www/html/trino目录下修改httpd配置文件新增parcel文件类型然后通过命令启动httpd服务:systemctl s...

发表评论    

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