[每周一更]-(第50期):Go的垃圾回收GC

在这里插入图片描述

参考文章:

  • https://juejin.cn/post/7111515970669117447
  • https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-garbage-collector/
  • https://colobu.com/2022/07/16/A-Guide-to-the-Go-Garbage-Collector/
  • https://liangyaopei.github.io/2021/01/02/golang-gc-intro/
  • https://xargin.com/impl-of-go-gc/
  • https://www.bookstack.cn/read/qcrao-Go-Questions/spilt.5.GC-GC.md

什么是GC?

Go语言的垃圾回收机制Garbage Collection,简称 GC

在传统编程语言中我们需要关注对象的分配位置,要自己去选择对象分配在堆还是栈上,
但在 Go 这门有 GC 的语言中,集成了逃逸分析功能,帮助我们自动判断对象应该在堆上还是栈上,可以使用 go build -gcflags="-m" 来观察逃逸分析的结果

GC的原理是什么?

Go语言的垃圾回收器采用了并发三色标记清除算法(Concurrent Tri-Color Mark-And-Sweep),(Stop-the-World,简称STW,指的是GC事件发生过程中,会产生应用程序的停顿。)尽可能减少STW(stop the world)时间,
以降低吞吐为代价换取低延迟,实现了高效的垃圾回收。
标记清除算法的基本原理是,垃圾回收器将所有的存活对象标记为“活”的,未被标记的对象则被认为是垃圾。经典的标记清除算法通常分为两个阶段:

  • 标记阶段:垃圾回收器从根对象开始,遍历所有可达对象,并将它们标记为“活”的。
  • 清除阶段:垃圾回收器从堆的起始地址开始遍历,将未被标记的对象清除,回收内存。

Go语言的垃圾回收器采用了三色标记法(Tri-Color Marking),将堆上的内存对象分为三种颜色

  • 白色:未被标记为“活”的对象,是潜在的垃圾,后续可能会被GC回收。
  • 灰色:待扫描的对象,当扫描某个灰色对象时,GC会将其标记为黑色,然后将该对象指向的所有对象都标记为灰色,待后续标记。
  • 黑色:被标记为“活”的对象,在这轮GC中不会被回收。

垃圾回收器开始工作时不存在黑色对象,垃圾回收器会将根对象标记为灰色,并从根对象(通常是栈对象和全局对象)开始遍历。垃圾回收器会将灰色对象标记为黑色,
并将该对象指向的对象标记为灰色。垃圾回收器重复这个过程,直到所有可达对象都被标记为黑色。最后,垃圾回收器清除所有未被标记为黑色的对象,即清除所有白色对象。

GC如何优化?

优化GC的开销是提高系统性能和响应速度的重要手段。

缩短STW时间

Go GC触发时机大体分为三种:

  • 手动触发:调用runtime.GC()
  • 常规触发:Target heap memory = Live heap + (Live heap + GC roots) * GOGC / 100
  • sysmon后台周期性强制触发GC
减少堆内存的分配和释放

GC开销大的根源在于heap object多,Go的每轮GC都是FullGC,每轮都要将所有heap object标记(mark)一遍,
即便大多数heap object都是长期alive的,因此,一个直观的降低GC开销的方法就是减少heap object的数量,即减少alloc。

  • 把小对象聚合到一个结构体中,然后做一次分配即可
  • 内存空间重用,如:sync.Pool

常见的GC

  • 引用计数法
    根据对象自身的引用计数来回收,当引用计数归零时进行回收,但是计数频繁更新会带来更多开销,且无法解决循环引用的问题。
    • 优点:简单直接,回收速度快
    • 缺点:需要额外的空间存放计数,无法处理循环引用的情况;
  • 标记清除法
    标记出所有不需要回收的对象,在标记完成后统一回收掉所有未被标记的对象。
    • 优点:简单直接,速度快,适合可回收对象不多的场景
    • 缺点:会造成不连续的内存空间(内存碎片),导致有大的对象创建的时候,明明内存中总内存是够的,但是空间不是连续的造成对象无法分配;
  • 复制法
    复制法将内存分为大小相同的两块,每次使用其中的一块,当这一块的内存使用完后,将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉
    • 优点:解决了内存碎片的问题,每次清除针对的都是整块内存,但是因为移动对象需要耗费时间,效率低于标记清除法;
    • 缺点:有部分内存总是利用不到,资源浪费,移动存活对象比较耗时,并且如果存活对象较多的时候,需要担保机制确保复制区有足够的空间可完成复制;
  • 标记整理
    标记过程同标记清除法,结束后将存活对象压缩至一端,然后清除边界外的内容
    • 优点:解决了内存碎片的问题,也不像标记复制法那样需要担保机制,存活对象较多的场景也使适用;
    • 缺点:性能低,因为在移动对象的时候不仅需要移动对象还要维护对象的引用地址,可能需要对内存经过几次扫描才能完成;
  • 分代式
    将对象根据存活时间的长短进行分类,存活时间小于某个值的为年轻代,存活时间大于某个值的为老年代,永远不会参与回收的对象为永久代。
    并根据分代假设(如果一个对象存活时间不长则倾向于被回收,如果一个对象已经存活很长时间则倾向于存活更长时间)对对象进行回收。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习每日小知识】数据增强

数据增强是通过对原始数据进行各种转换和修改来人工生成附加数据的过程,旨在增加机器学习模型中训练数据的大小和多样性。这对于计算机视觉领域尤为重要,因为图像经常被用作输入数据。 计算机视觉中的数据增强 数据增强的主要目标是解决过拟合问题&…

数据库的学习笔记——第一篇

SQL通用语法 SQL语句 DDL 数据定义 数据库、表字段 DML 数据操作 增删改 DQL 数据查询 查询表中记录 DCL 数据控制 创建用户、控制用户权限 DLL语句——数据库操作 SHOW DATABASES; # 查询数据库SELECT DATABASE(); # 查询当前数据库CREATE DATABASE [IF …

【C语言】函数

函数是什么? “函数”是我们早些年在学习数学的过程中常见的概念,简单回顾一下:比如下图中,你给函数 f(x)2*x3 一个具体的x,这个函数通过一系列的计算来返回给你一个结果(图示如下)。 这就是数学中函数的基本过程和作用。但是你…

Python实现PowerPoint(PPT/PPTX)到PDF的批量转换

演示文稿是一种常见传达信息、展示观点和分享内容的形式,特别是PowerPoint演示文稿,广泛应用于各行各业,几乎是演讲等场合的必备工具。然而,演示文稿也有其限制,对设备的要求较高,且使用不同的软件或设备演…

PyTorch 入门学习数据操作之创建

简介 在深度学习中,我们通常会频繁地对数据进行操作;要操作一般就需要先创建。 官方介绍 The torch package contains data structures for multi-dimensional tensors and defines mathematical operations over these tensors. Additionally, it pr…

x-cmd pkg | bit - 实验性的现代化 git CLI

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 bit,由 Chris Walz 于 2020 年使用 Go 语言开发,提供直观的命令行补全提示和建立在 git 命令之上的封装命令,旨在建立完全兼容 git 命令的现代化 CLI。 首次用户 使用 x bit 即可自…

毛虫目标检测数据集VOC格式550张

毛虫,一种令人惊叹的生物,以其独特的外貌和习性,成为了自然界中的一道亮丽风景。 毛虫的外观非常特别,身体呈圆柱形,表面覆盖着许多细小的毛发,这使得它们在叶子上伪装得非常好。它们的头部有一对坚硬的颚…

网络安全应急响应工具之-流量安全取证NetworkMiner

在前面的一些文章中,用了很多的章节介绍流量分析和捕获工具wireshark。Wireshark是一款通用的网络协议分析工具,非常强大,关于wireshark的更多介绍,请关注专栏,wireshark从入门到精通。本文将介绍一个专注于网络流量取…

如何保证幂等性

什么是幂等性? 调用方对系统进行重复的调用,不管调用多少次,调用对系统的影响都是相同的。系统默认认为外部系统调用失败是常态,失败之后会有重试。 什么情况下会导致幂等性问题? 网络波动,可能引起重复…

vmware虚拟机安装esxi7.0步骤

一、安装准备 1、下载镜像文件 下载链接:https://pan.baidu.com/s/12XmWBCI1zgbpN4lewqYw6g 提取码:mdtx 2、vmware新建一个虚拟机 2.1 选择自定义 2.2 选择ESXi对应版本 2.3 选择稍后安装操作系统 2.4 默认选择 2.5 自定义虚拟机名称及存储位置 2…

使用Go语言的HTTP客户端库进行API调用

随着微服务架构和RESTful API的普及,API调用成为了日常开发中的常见任务。Go语言提供了多种工具和库来帮助开发者轻松地与API进行交互。本文将介绍如何使用Go语言的HTTP客户端库进行API调用。 在Go语言中,标准库中的net/http包提供了基本的HTTP客户端功…

maven repository的官方网址

本文来记录下maven repository的官方网址 文章目录 记录例子 记录 maven仓库官方地址:https://mvnrepository.com/ 例子 比如搜索elasticsearch 选择适用的版本

win7系统报错msvcp140.dll丢失的多种解决方法分享

在Windows 7操作系统中,msvcp140.dll是一个非常重要的动态链接库文件,它负责许多应用程序的正常运行。然而,由于各种原因,我们可能会遇到丢失msvcp140.dll的问题。当msvcp140.dll文件丢失或损坏时,可能会导致程序无法启…

华为商城秒杀时加密验证 device_data 的算法研究

前言 之前华为商城放出 Mate60 手机时, 想给自己和家人抢购一两台,手动刷了好几天无果后,决定尝试编写程序,直接发送 POST 请求来抢。通过抓包和简单重放发送后,始终不成功。仔细研究,发现 Cookie 中有一个名为 devic…

Android ValueAnimator属性动画ObjectAnimator使View颜色渐变,Kotlin

Android ValueAnimator属性动画ObjectAnimator使View颜色渐变,Kotlin 设置背景颜色渐变: private var iv: ImageView? nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activit…

STM32F103C8T6制作简易示波器

1设计需求 通过stm32f103c8t6实现一个简易示波器功能,该示波器可以检测0-3.6khz频率范围内的波形。 也可以输出波形,输出方波、三角波、正弦波。 2技术方案 通过stm32的ADC功能,采集输入信号,最后由oled屏进行显示。 采样频率…

逻辑斯蒂回归

逻辑斯蒂回归简介 逻辑斯蒂回归(Logistic Regression)是一个非常经典的算法,虽然被称为回归,但其实际上是分类模型,并常用于二分类。因为通过逻辑回归模型,我们得到的计算结果是0-1之间的连续数字&#xff…

【Android Studio】在单独的窗口中启动模拟器

参考:https://developer.android.com/studio/run/emulator-launch-separate-window?hlzh-cn 默认情况下,Android 模拟器会在 Android Studio 中运行。这样,您就可以高效地使用屏幕空间,使用热键在模拟器和编辑器窗口之间快速导航…

03 decision tree(决策树)

一、decision tree(决策树) 1. classification problems(纯度) i . entropy (熵) ​ 作用:衡量一组数据的纯度是否很纯 ,当五五开时他的熵都是最高的,当全是或者都不是…

Guava Cache 异步刷新技巧,你值得拥有!

以下文章来源于勇哥Java实战 ,作者勇哥 Guava Cache是一款非常优秀的本地缓存框架。 这篇文章,我们聊聊如何使用 Guava Cache 异步刷新技巧带飞系统性能 。 1 经典配置 Guava Cache 的数据结构跟 JDK1.7 的 ConcurrentHashMap 类似,提供了基…