这是我参与「第五届青训营」伴学笔记创作活动的第4天。本篇为第五届字节跳动青训营-寒假专场-后端基础课程的笔记。
本节课围绕 Go 内存分配和编译器相关知识展开,探讨目前 Go 内存管理过程中问题,提出解决方案,同时将通过对编译器基本算法讲解,引出编译器优化路径。
性能优化:提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力
- 用户体验
- 资源高效利用:降低成本,提高效率
内存管理
动态内存:程序在运行时根据需求动态分配的内存
自动内存管理:由程序语言的运行时系统管理动态内存
- 避免手动内存管理,专注于实现业务逻辑
- 保证内容使用的正确性与安全性
三个任务
- 为新对象分配空间
- 找到存活对象
- 回收死亡对象的内存空间
自动内存管理相关概念
- Mutator:业务线程,分配新对象,修改对象指向关系
- Collector:GC线程,找到存活对象,回收死亡对象的内存空间
- Serial GC:只有一个collector
- Parallel GC:支持多个collectors同时回收的GC算法
- Concurrent GC:mutator(s)与collector(s)可以同时执行
评价GC算法:
- 安全性
- 吞吐率
- 暂停时间
- 内存开销
编译器优化
编译器结构
- 重要的系统软件
- 识别符合语法和非法的程序
- 生成正确且高效的代码
- 分析部分(前端front end)
- 词法分析,生成词素
- 语法分析,生成语法树
- 语义分析,收集类型信息,进行语义检查
- 中间代码生成,生成intermediate representation
- 综合部分(后端back end)
- 代码优化,及其无关优化,生成优化后的IR
- 代码生成,生成目标代码
静态分析
- 静态分析:不执行程序代码,推导程序行为,分析程序性质
- 控制流:控制程序的流
- 数据流:数据在控制流上的传递