这是我参与「第五届青训营 」伴学笔记创作活动的第5天
今天补一下青训营的笔记,然后巩固一下基础,做一下记录笔记,
一、重点内容
- 自动内存管理
- 追踪垃圾回收
- Go 内存管理的问题
二、详细知识点介绍
自动内存管理
-
首先讲了一下自动内存,和动态内存的概念
-
动态内存 :程序在运行时根据需求动态分配的内存:例如在c语言的malloc(),可以更精度的控制内存
-
自动内存管理(垃圾回收):由程序语言的运行时系统管理动态内存
-
可以帮助我们避免手动内存管理,专注于实现业务逻辑
-
保证内存使用的正确性和安全性:double-free problem,use-after-free problem
三个任务
- 为新对象分配空间
- 找到存活对象
- 回收死亡对象的内存空间。
追踪垃圾回收
一个对象被回收的条件:,一旦这个对象不可达就可以在垃圾回收的控制循环里被 GC 回收了
判断是否可达:对全局变量和函数栈的变量,标记为可达, 从标记的数据开始,逐步标记可以访问的变量。
具体步骤:
- 标记根对象,包括静态变量、全局变量、常量和线程栈等;
- 标记可达对象,从根对象出发,找到所有可达对象;
- 清理所有不可达对象:Coping GC、Mark-sweep GC和Mark-compact GC。
Go 内存管理的问题
-
对象分配是非常高频的操作:每秒分配GB级别的内存
-
小对象占比较高
-
Go内存分配比较耗时
-
分配路径长: g -> m -> p -> mcache -> mspan -> memory block -> return pointer
-
pprof:对象分配的函数是最频繁调用的函数之一
三、课后个人总结
可以说了解go的内存管理和相关的gc内容,但这一部分的内容明显的难度会比较高,需要基础较好才可以消化掉,所以,这一部分哈还是以后对go的了解有一定了解才来继续加深印象。