Go性能优化及内存管理

72 阅读1分钟

1.哪里优化?

image.png

1.pprof->发现代码冗余->业务层优化

2.sdk优化

image.png

2.自动内存管理

image.png

自动内存管理做了什么?

1.分配内存给新对象

2.找到已有的对象

3.回收死对象

image.png

如何回收垃圾?

  1. 追踪垃圾回收

image.png

2.分代GC(generational GC)

image.png

3.引用计数

image.png

Go内存分配-分块

image.png

Q: 1.为什么分块? 类似os的内存管理模式将内存先分块吗
2.分块的好处? 不同块的里面的小块大小不同可灵活适合内存的对象吗

Go内存分配-缓存

image.png 类似多级缓存?

go对象分配中发现多为小对象分配,而小对象分配通过go的分配机制 g->t->p->mcache->mspan->memory block->return opint 消耗过高,因此字节跳动对其小分配对象优化提出了Balance GC

image.png 缺点:1.一个GAB若有小对象1B,则该1k的GAB都会被标记为存活对象,内存浪费

对此解决方案:copying gc

image.png

image.png

3.编译器和静态分析

3.1编译器结构

image.png

3.2 静态分析

image.png

3.3过程内分析和过程件分析

image.png

4.GO编译器优化

1.inline:函数内联

image.png

Beast Mode 对编译器函数内联规则优化,让尽量发生函数内联

2.逃逸分析 分析没逃逸的对象,让对象尽量在栈上分配.特点,栈的分配回收有os操作,快!

image.png