0%

逃逸分析能做什么?如何进行逃逸分析?

(上级垃圾回收 问题逻辑- 垃圾回收->逃逸分析->内存逃逸)

逃逸分析是什么:编译器决定内存分配位置的方式,就称之为逃逸分析(escape analysis)。逃逸分析由编译器完成,作用于编译阶段。

逃逸分析能做什么:可以了解程序哪些内存在栈上,哪些在堆上,从而优化减少垃圾回收提升性能。

如何进行逃逸分析:go语言可以使用go build -gcflags ‘-m -N -l’ test.go 的方式 查看编译结果中的逃逸情况 在堆上(heap)的就发生了逃逸

必然不会发生逃逸的情况:

  1. 指针被没有发生逃逸的变量引用

  2. 仅仅在函数被对变量进行取地址操作,没有将指针传出

一定逃逸

  1. 构造函数new/make 返回的指针变量一定逃逸
  2. 被已经逃逸指针变量引用指针,一定发生逃逸
  3. 指针类型是slice,map,chan 引用指针一定发生逃逸

Maybe 逃逸
将指针作为入参传给别的函数,这里看指针在被传入函数的处理过程,如果发生上边三种情况会逃逸,否则不会

传值 VS 传指针: 传值会拷贝整个对象,而传指针只会拷贝指针地址,指向的对象是同一个。传指针可以减少值的拷贝,但是会导致内存分配逃逸到堆中,增加垃圾回收(GC)的负担。在对象频繁创建和删除的场景下,传递指针导致的 GC 开销可能会严重影响性能。

一般情况下,对于需要修改原对象值,或占用内存比较大的结构体,选择传指针。对于只读的占用内存较小的结构体,直接传值能够获得更好的性能

-------------本文结束感谢您的阅读-------------
打赏一瓶矿泉水