Go语言性能优化&内存管理 | 青训营笔记

74 阅读2分钟

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

本文记录的是课堂过程中的内容总结和梳理

自己的感悟较少,毕竟是初学者,很多知识只是刚入门

如有错误还请不吝赐教

1.性能优化(追求极致性能)

1.1性能优化是什么?

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

1.2为什么要做性能优化?

用户体验:带来用户体验的提升———让抖音更丝滑,让双十一不再卡顿 资源高效率利用:降低成本,提高效率———很小的优化乘以海量机器会是显著的性能提升和成本节约

1.3性能优化的层面

image.png

在上图的代码结构层次中,需要优化的主要有两大方面以及数据驱动:
(1)业务层优化
  • 针对特定场景,具体问题,具体分析
  • 容易获得较大性能收益

(2)语言运行时优化

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

(3)数据驱动

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

1.4性能优化与软件质量

  • 软件质量至关重要
  • 在保证接口稳定的前提下改进具体实现
  • 测试用例:覆盖尽可能多的场景,方便回归
  • 文档:做了什么,没做什么,能达到怎样的效果
  • 隔离:通过选项控制是否开启优化
  • 可观测:必要的日志输出

1.自动内存管理

1.1概念

(1)动态内存

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

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

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

(3)内存管理的三个任务

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

(4)其他相关的概念

  • Mutator:业务线程,分配新对象,修改对象指向关系
  • Collector: GC线程,找到存活对象,回收死亡对象的内存空间
  • Serial GC:只有一一个collector
  • Parallel GC:支持多个collectors同时回收的GC算法
  • Concurrent GC: mutator(s)和collector(s)可以同时执行Collectors必须感知对象指向关系的改变!

image.png

(4)自动内存管理-相关概念

评价GC算法

  • 安全性(Safety):不能回收存活的对象基本要求
  • 吞吐率(Throughput):1-(GC时间/程序执行总时间)花在GC上的时间
  • 暂停时间(Pause time): stop the world (STW)业务是否感知
  • 内存开销(Space overhead) GC元数据开销

追踪垃圾回收(Tracing garbage collection)
引用计数(Reference counting)