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

61 阅读2分钟

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

今天课程的主要内容如下:

  1. 自动内存管理
  2. Go 内存管理及优化
  3. 编译器和静态分析
  4. Go 编译器优化

前言

首先我们要清楚什么是性能优化,以及为什么要做性能优化。

性能优化是什么?

  • 提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力

为什么要做性能优化?

  • 用户体验:带来用户体验的提升。
  • 资源高效利用:降低成本,提高效率一很小的优化乘以海量机器会是显著的性能提升和成本节约

性能优化涉及到哪些层面?

业务层优化

  • 针对特定场景,具体问题,具体分析
  • 容易获得较大性能收益

语言运行时优化

  • 解决更通用的性能问题
  • 考虑更多场景
  • Tradeoffs

数据驱动

  • 自动化性能分析工具----pprof
  • 依靠数据而非猜测
  • 首先优化最大瓶颈

1、自动内存管理

1.1 什么是自动内存管理

  • 自动内存管理是由程序语言的运行时系统管理动态内存。

1.2 自动内存管理的作用

  • 避免手动内存管理,专注于实现业务逻辑
  • 保证内存使用的正确性安全性: double-free problem, use-after-free problem

1.3 自动内存管理的三个任务

  • 为新对象分配空间
  • 找到存活对象
  • 回收死亡对象的内存空间

2、Go内存管理及优化

  • Go内存管理一分块

  • Go内存管理一缓存

  • Go对象分配的性能问题

    • 分配路径过长
    • 小对象居多
  • Balanced GC

    • 指针碰撞风格的对象分配
    • 实现了copying GC
    • 性能收益

3、编译器和静态分析

涉及到的主要内容如下:

  • 编译器的结构与编译的流程
  • 编译器后端优化
  • 数据流分析和控制流分析
  • 过程内分析和过程间分析

4、Go编译器优化

  • Go编译器优化的问题
    • 采用的优化较少
    • 追求编译时间短,因此没有进行复杂的代码分析和优化
  • 函数内联
  • 逃逸分析

5、总结

本节课学习了GO语言内存优化和编译优化的相关知识,平时做项目的过程中更多的是考虑如何实现业务逻辑,并没有接触过这一块,所以这些内容学起来有点吃力。

但是优化对于大型软件来说是必不可少的,通过优化可以提升用户体验度,并且可以降低成本,两全其美。

另外本门课分析问题的方法与解决问题的思路,不仅适用于Go语言,其他语言的优化也同样适用。