[ 后端基础Day4 | 青训营笔记]

38 阅读2分钟

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

一、内容:

1.自动内存管理

动态内存

程序在运行时根据需求动态分配的内存:malloc()

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

避免手动内存管理,专注于实现业务逻辑

保证内存使用的正确性和安全性

三个任务

为新对象分配内存

找到存活对象

回收死亡对象的内存空间

image-20230120162659955.png

image-20230120162837308.png 追踪垃圾回收

image-20230120163316789.png

引用计数

image-20230120163707737.png

分代GC

image-20230120163601039.png

清理策略

copying GC:将对象复制到另外的内存空间

image-20230120163405690.png

Compact GC:原地整理对象

image-20230120163434378.png

Mark sweep GC:使用free list管理空间

image-20230120163510199.png

2.Go内存分配及管理

目标:为对象在heap上分配内存

提前将内存分块

调用系统调用mmap()向os申请一大块内存

先将内存划分成大块

再将大块继续划分为特定大小的小块,用于对象分配

noscan mspan:分配不包含指针对象——GC不需要扫描

scan mspan分配包含指针对象——GC需要扫描

分配对象:根据对象大小,选择合适的块返回

image-20230120164306229.png

image-20230120164327804.png

3.Banlance GC

image-20230120164645638.png

image-20230120164738182.png

4.编译器和静态分析

image-20230120164849611.png

静态分析:不执行程序代码,推导程序行为,分析程序性质。

控制流:程序执行的流程

数据流:数据在程序上的传递

通过分析控制流和数据流,我们可以知道更多关于程序的性质

函数内联

image-20230120165226203.png

逃逸分析

image-20230120165258092.png

Beast Mode

image-20230120165324013.png

二、课后个人总结:

本节课在Go 内存分配和编译器相关知识展开,讲解了现有的内存分配与编译器策略以及他们存在的缺点,并且给出了字节的解决方案,优化的思路,让我对内存分配和编译器的知识和优化过程有了深入的认识。