这是我参与「第五届青训营 」伴学笔记创作活动的第6天
一、重点内容:
- 本次主要学习了四个方面:自动内存管理、Go内存管理及优化、编译器和静态分析以及Go编译器优化。
二、详细知识点介绍:
- 自动内存管理
- 自动内存管理是由程序语言的运行时系统管理动态内存。它可以帮助避免手动内存管理,专注于实现业务逻辑,并确保正确性和安全性。
- 自动内存管理的任务是为新对象分配空间、确保存活对象、回收死亡对象的空间。
- 追踪垃圾回收
- 标记根对象,并根据标记找到所有对象,在需要回收的时候清理对象。
- coping GC:将存活对象从一块空间复制到另一块,原先的空间可以直接进行对象分配。
- Mark-sweep GC: 将死亡对象所在内存块标记为可分配,使用 free list 管理可分配的空间。
- Mark-compact GC: 将存活对象复制到同一块内存区域的开头。
- 引用计数
- 每个存活对象都有一个与之关联的引用计数。
- 当且仅当引用计数大于0时,对象存活。
- Go内存管理及优化
-
内存管理的目标时为对象在heap上分配内存。
-
内存管理的过程
- 调用系统调用 mmap() 向 OS 申请一大块内存,例如 4 MB。
- 先将内存划分成大块,例如 8 KB,称作 mspan。
- 再将大块继续划分成特定大小的小块,用于对象分配。
- noscan mspan: 分配不包含指针的对象 —— GC 不需要扫描
- scan mspan: 分配包含指针的对象 —— GC 需要扫描
-
内存管理应当根据业务的实际需求去优化。不同场景下的内存分配方式会造成不同的分配效率。
- 编译器和静态分析
- 编译器结构如图所示:
- 静态分析就是不执行代码,仅进行程序推导。
- 控制流时程序的执行流程。
- 数据流是数据在控制流上的传递。
- Go编译器优化
- 目的是在用户不会感知到的状态下,通过优化就可以获得性能收益。可以适当增加编译时间,减少运行时时间。
- 方式有函数内联、逃逸分析、语义分析等。
- 该部分内容涉及较深,博主水平不足,具体可自行查阅相关资料,这里不再赘述。
三、实践练习例子:
- 本次课程暂无实践练习代码。
四、课后个人总结:
-
该课程将Go语言进行了进一步地深入,对于小白来说可能相对不是那么友好。但是经过了几天的学习和训练,这门课对我来说还是大有益处的。
-
不得不再一次感叹,课上两小时,课后两星期啊!继续加油,课程满满的都是干货。