Go语言内存管理 | 青训营笔记

52 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

在今天的学习中,着重学习了Go语言的内存管理机制. 不论什么具有GC的编程语言, 所对应的GC理论都是相通的,在业界都有相同且成熟的解决方案,因此这一章节的内容是十分重要的.

1. 自动内存管理

动态内存:程序在运行时根据需求动态分配的内存(需要手动管理内存) 自动内存管理(垃圾回收):由程序语言的运行时系统管理动态内存

  • 避免手动内存管理,专注于实现业务逻辑
  • 保证内存使用的正确性和安全性

自动管理内存的三个任务:

  • 为新对象分配空间
  • 找到存活对象
  • 回收死亡对象的内存空间

相关概念:

image.png

image.png

image.png

追踪垃圾回收:

对象被回收的条件:

  • 指针指向关系不可达的对象
  • 标记根对象,找到可达的对象(静态变量,全局变量,常量,线程栈等)
  • 清理所有不可达的对象
    • 将存活对象复制到另外的内存空间(Copying GC)
    • 将死亡对象的内存标记为"可分配"(Mark-sweep GC)
    • 移动并整理存活对象(Mark-compact GC)

根据对象的生命周期,使用不同的标记和清理策略

分代GC(Generational GC):

image.png

引用计数

  1. 每个对象都有一个与之关联的引用数目
  2. 象存活的条件:当且仅当引用计数大于0

image.png

2. Go内存管理及优化

Go内存分配 -- 分块

  • 为对象在heap上分配内存
  • 提前将内存分块

image.png

Go内存分配 -- 缓存

image.png

Go内存管理优化

image.png