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

57 阅读2分钟

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

前言

这是小白初接触到Go语言的内容,本课程高性能Go语言发行版优化与落地实践。

主要讲述自动内存管理、Go 内存管理及优化、编译器和静态分析、Go编译器优化

(1)性能优化是什么?

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

为什么要做性能优化?

用户体验:带来用户体验的提升

资源高效利用:降低成本,提高效率

(2)自动内存管理和Go 内存管理及优化 1.自动内存管理(垃圾回收) :由程序语言的运行时系统管理动态内存

避免手动内存管理,专注于实现业务逻辑

保证内存使用的正确性和安全性: double- free problem, use- after- free problem

2.基本概念

Mutator:业务线程,分配新对象,修改对象指向关系

Collector: GC线程,找到存活对象,回收死亡对象的内存空间

Serial GC:只有一个collector

Parallel GC:支持多个collectors同时回收的GC算法

Concurrent GC: mutator(s)和collector(s)可以同时执行

3.评价GC算法

安全性(Safety):不能回收存活的对象 基本要求

吞吐率(Throughput): 花在GC上的时间

暂停时间(Pause time): stop the world (STW) 业务是否感知

内存开销(Space overhead) GC元数据开销

追踪垃圾回收(Tracing garbage collection)

引用计数(Reference counting)

(3)编译器和静态分析和Go编译器优化

1.为什么做编译器优化:

用户无感知,重新编译即可获得性能收益

通用性优化

2.现状

采用的优化少

编译时间较短,没有进行较复杂的代码分析和优化

3.编译优化的思路

场景:面向后端长期执行任务

Tradeoff:用编译时间换取更高效的机器码

4.Beast mode

1)函数内联:将被调用函数的函数体(callee)的副本替换到调用位置(caller) 上, 同时重写代码以反映参数的绑定。

Beast mode:调整函数内联的策略,使更多函数被内联

2)逃逸分析:分析代码中指针的动态作用域:指针在何处可以被访问

Beast mode:函数内联拓展了函数边界,更多对象不逃逸

小结

本课程比较偏理论和底层,以往的学习中编译原理和JVM有接触过类似的知识。