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

38 阅读2分钟

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

今天补一下青训营的笔记,然后巩固一下基础,做一下记录笔记,

一、重点内容

  1. 自动内存管理
  2. 追踪垃圾回收
  3. Go 内存管理的问题

二、详细知识点介绍

自动内存管理

  • 首先讲了一下自动内存,和动态内存的概念

  • 动态内存 :程序在运行时根据需求动态分配的内存:例如在c语言的malloc(),可以更精度的控制内存

  • 自动内存管理(垃圾回收):由程序语言的运行时系统管理动态内存

  • 可以帮助我们避免手动内存管理,专注于实现业务逻辑

  • 保证内存使用的正确性和安全性:double-free problem,use-after-free problem

三个任务

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

追踪垃圾回收

一个对象被回收的条件:,一旦这个对象不可达就可以在垃圾回收的控制循环里被 GC 回收了

判断是否可达:对全局变量和函数栈的变量,标记为可达, 从标记的数据开始,逐步标记可以访问的变量。

具体步骤:

  • 标记根对象,包括静态变量、全局变量、常量和线程栈等;
  • 标记可达对象,从根对象出发,找到所有可达对象;
  • 清理所有不可达对象:Coping GC、Mark-sweep GC和Mark-compact GC。
Go 内存管理的问题
  1. 对象分配是非常高频的操作:每秒分配GB级别的内存

  2. 小对象占比较高

  3. Go内存分配比较耗时

  4. 分配路径长: g -> m -> p -> mcache -> mspan -> memory block -> return pointer

  5. pprof:对象分配的函数是最频繁调用的函数之一

三、课后个人总结

可以说了解go的内存管理和相关的gc内容,但这一部分的内容明显的难度会比较高,需要基础较好才可以消化掉,所以,这一部分哈还是以后对go的了解有一定了解才来继续加深印象。