golang zero gc

 

 1. 什么是zero gc

指的是那些在gc扫描期间,不需要被runtime扫描的对象,扫描的数据越少,gc扫描所花的时间就越短;zero gc并不代表创建的对象0开销,该开辟的内存依旧需要的,而指的是zero gc scan

ps1:在写基础框架的地方,要强调zero gc

ps2:在写业务代码的地方,不要过度zero gc,甚至不需要过度带着心里负担,因为一个业务logic一般不会产生海量对象

2.怎么验证zero gc

 

 

 先看下面几个图

 

 

 

 从上面可以看出,如果你创建的对象包含指针(string内部记录了指向数据的指针,你也可以用自定义一些嵌套struct来验证,结果是一样的),那么gc的时候,就需要被扫描;

如果切片的类型是一个person类型,而不是person的指针类型的话,那么person结构体中的指针类型越多,gc消耗的时间越长;

如果切片的类型是一个person的指针类型,person结构体中的指针类型字段多少,并不过太过影响gc消耗的时间;

如果你创建的对象不包含指针,那么gc的时候就不需要被扫描;

3.结论

在写一些组件库的时候,比如im,它内部肯定需要维护海量用户与链接之间的关系(是一个常驻的对象),那么如果能做到这个对象zero gc的话,那么整体性能就会上一个很大的台阶

 

 像bigcache,引入本地缓存,那么意味着我们的实例中必然需要常驻一个内存对象,如果每次gc的时候都需要扫描它,那么间接就增加了gc pause的时间,它通过map来做管理

kv做了很大的优化,还是蛮巧妙的。

key:通过hash算法,将“按常理应该用string类型的key”,将其做hash之后,得到一个数值(非指针)

value:是一个偏移量,每一个value会存放到一个byte切片(byte非指针),每次取的时候,通过计算偏移量得到value,再将其decode成我们的对象

正如它上面最后一句所说的:本来1w个value,按照常理,我们存放的多多少少都要有指针类型的,这样gc就要扫描他们,耗时长;现在优化之后,我们只需要维护一个指针,指向这个[]byte,这样

极大的提高了收敛比,本来扫描1w的,现在只要扫描1个,是不是达到了zero gc的目的

 

https://github.com/julienschmidt/httprouter

https://stackoverflow.com/questions/28780543/golang-zero-garbage-propagation-or-efficient-use-of-memory

https://blog.gopheracademy.com/advent-2018/avoid-gc-overhead-large-heaps/

https://www.bilibili.com/video/BV1aL4y1L7Kk?spm_id_from=333.337.search-card.all.click

posted @ 2022-04-30 12:11  James陶  阅读(874)  评论(0)    收藏  举报