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

46 阅读3分钟

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

一、本堂课重点内容

  • 内存管理优化
  • 编译器优化

二、详细知识点介绍

1.内存管理优化

性能优化是什么:为了追求极致的性能,提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力。

为什么要做性能优化:给用户带来体验的提升从而减低成本,提高效率。

性能优化的层面:从业务层优化到语言运行时优化到数据驱动。

性能优化于软件质量:软件质量至关重要,在保证接口稳定2的前提下改进具体实现,使用测试案例:覆盖尽可能多的场景,方便回归,在文档中做了什么,每做什么,能达到怎样的效果,

隔离:通过选项控制是否开启优化,可观测中必要的日志输出。

1.1自动内存管理-相关概念

评价gc算法:具有安全性:不能回收存活的对象的基本要求和吞吐率,暂停时间、内存开销对于元数据开销。

追踪垃圾回收:对象被回收的条件:指针指向关系不可达的对象,标记根对象,这样可找到标记的可达对象,清理所有不可达的对象。根据对象的生命周期,使用不同的标记和清理策略。

分代GC:对于分代假说,很多对象在分配出来后很快就不再使用了,对于每个对象都有年龄都需经历GC的次数,来降低整体内存管理的开销。

引用计数:每一个对象都有一个与之关联的引用数目,使用计数可以把内存管理的操作平摊到程序执行过程中,开销大,维护引用通过原子操作保证对引用技术操作的原子性和可见性,可能引发暂停。

1.2.Go内存分配-缓存

使用TCMalloc,每个p包含一个mcache用于快速分配,用于为绑定于p上的g分配对象,mcache管理一组mspan,当mspan中没有分配的对象,mspan会被缓存在mcentral中,而不是立刻释放并归还给OS。

2.编译器

2.1编译器的结构

分为重要的系统软件(识别符合语法和非法的程序、生成正确且高效的代码),分析部分(词法、语法、语义、中间代码),综合部分(代码优化,代码生成)

2.2静态分析

不执行程序代码,推到程序的行为,分析程序的性质,控制流方面对于执行的流程,可以在数据流上控制传递

2.3过程内分析和过程间分析

  • 过程内分析
  • 过程间分析
  • 为什么过程分析中的问题:数据流分析,更加i具体类型,产生了新的控制流,联合求解,比较复杂

2.4函数内联(Inlinging)

将被调用函数的函数体(callee)的副本替换到调用位置(caller)上,同时重写代码以反映参数的绑定,帮助函数调用开销,将过程分析转化为过程内分析。

2.5逃逸分析

分析代码中指针的动态作用域,在指针在何处可以被访问,对于逃逸的对象可以在栈上分配。

三、课后个人总结

在学习内存管理的分块和缓存了解到Go中的分配管理,对于对象分配的性能问题得到非常多有用的理解,学习到指针碰撞风格的对象分配,实现了GC复制,提高性能收益,但是相信自己会继续保持学习的上进心,了解到了编译器优化过程中的一些问题,通过micro-benchmark快速验证性能优化和性能收益方面,今天的学习希望能更上一层楼,加油!

四、引用

[字节内部课-Go 内存管理 & 编译器优化思路]  juejin.cn/course/byte…