Golang 垃圾回收

庆云2年前技术文章1403

1、标记清除算法

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

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

1.1 标记清除算法阶段

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

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

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

1.png

1.2 标记清除算法步骤

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

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

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

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

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


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

2、标记复制算法

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

2.png

3、标记整理算法

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

3.png





相关文章

COS快照迁移ES集群

一、COS 全量快照备份基于 COS 快照的迁移方式是使用 ES 的 snapshot api 接口进行迁移,基本原理就是从源 ES 集群创建索引快照,然后在目标 ES 集群中进行恢复。通过 snap...

apache Hbase2.x  disbale 表卡住

apache Hbase2.x disbale 表卡住

1、现象通过hbase shell disble 表,显示表已经被disable了,但是在drop table 时,又显示出现表被disable2、分析通过命令查看表的状态is_disabled 'E...

HBase使用snappy压缩

HBase使用snappy压缩

安装编译环境依赖yum install -y automake autoconf gcc-c++ cmake libedit libtool openssl-devel ncurses-devel安装...

TDengine集群部署

TDengine集群部署

1、基础环境操作系统:centos7.9内核版本:3.10下载地址:https://docs.taosdata.com/releases/tdengine/#3110架构设置:3 dnode,3 mn...

ORC、Parquet 等列式存储的优点

ORC 和Parquet 都是高性能的存储方式,这两种存储格式总会带来存储和性能上的提升Parquet:1. Parquet 支持嵌套的数据模型,类似于Protocol Buffers,每一个数据模型...

pgbench 压测工具

pgbench 压测工具

一、基本参数pgbench工具是Postgres自带的一款轻量型基准压测工具。它自定义相关场景下脚本进行1.1 初始化参数参数含义-i / --initialize调用初始化模式-I init_ste...

发表评论    

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