性能优化及内存管理 | 青训营笔记

40 阅读2分钟

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

一、本堂课重点内容:

本节课将主要介绍关于高性能 Go 语言发行版优化的内存管理优化,分享自动内存管理与 Go 内存管理知识,提供可行性的优化建议。围绕 Go 内存分配和编译器相关知识展开,探讨目前 Go 内存管理过程中问题,提出解决方案,同时将通过对编译器基本算法讲解,引出编译器优化路径。

二、详细知识点介绍:

一.为什么要做性能优化

性能优化是提升软件系统处理能力,减少不必要的消耗,充分发掘计算机算力。 更稳定: 应用程序能够稳定运行,能够正常使用,不出现 Crash 和 ANR 这两个错误 更流畅: 应用程序运行得更加流畅 损耗更低: 应用程序对内存,电量以及网络资源占用更低。

二.性能优化的层面

性能优化的层面主要分为:业务代码 SDK库 基础库 程序运行时 OS。

业务层优化

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

语言运行时优化

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

数据驱动

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

三.自动内存管理

动态内存

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

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

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

四.追踪垃圾回收步骤

  1. ·对象被回收的条件:指针指向关系不可达的对象
  2. ·标记根对象
  3. ·标记:找到可达对象
  4. ·清理:所有不可达对象

五.如何使用Balanced GC

  • 每个g都绑定一大块内存(1KB),称作 goroutine allocation buffer (GAB)
  • .GAB用于noscan类型的小对象分配:<128 B
  • ·使用三个指针维护GAB: base, end,top
  • Bump pointer(指针碰撞)风格对象分配
  • ·无须和其他分配请求互斥
  • .分配动作简单高效
if top + size <= end {
addr := top
top += size
return addr
}

三、课后个人总结:

本次课程解锁了从未了解过的领域,过去做项目过程中,并没有考虑过性能优化,自动内管理。本次课程学到了自动内存管理的背景和意义,概念和评价方法,追踪垃圾回收,引用计数,分代GC,以及性能优化的各类知识,尤其适用Go语言进行内存管理的的方法,受益颇深。

四、引用参考:

掘金课程:

juejin.cn/course/byte… juejin.cn/course/byte…