sync.Pool的在web framework中的使用疑问
来源:1-16 辅导 + 案例分析 + 答疑
拧壶冲
2021-07-03 15:21:27
在研究chi的源码,正好学习下sync.Pool的使用方法。
一个请求到来,到返回响应,我们整个生命周期内都是使用pool中创建的,context,但是我们79行,创建了,就马上把它给reset了呢?不是应该88行的serverHttp执行完了再执行,reset,再put回pool吗?
这样cache,我还是没有太理解为什么这样的方式可以减小GC的压力?只是缓存而已啊?pool的这种设计是如何达到减少GC的效果的?
1回答
Xargin
2021-07-03
一个请求到来,到返回响应,我们整个生命周期内都是使用pool中创建的,context,但是我们79行,创建了,就马上把它给reset了呢?不是应该88行的serverHttp执行完了再执行,reset,再put回pool吗?
使用 pool 的时候,一定会有 reset 操作,但 reset 放在 Put 之前;或者 Get 之后,都是可以的,只要保证 reset 过就可以
这样cache,我还是没有太理解为什么这样的方式可以减小GC的压力?只是缓存而已啊?pool的这种设计是如何达到减少GC的效果的?
使用 pool 时,当请求的 qps 稳定后,对象都是从 pool 里拿的,并且不会生成新的对象,对象总数取决于于当前活跃的请求数。
不使用 pool 时,每个请求都会创建新的 object,这些 object 在请求结束后直接变成了垃圾,相比使用 pool 会不停地创建更多对象,这样 GC 要负责扫描对象(比使用 pool 创建的对象数量更多),同时要负责回收所有变成垃圾的对象(所有新创建的对象都变成了垃圾,要 sweep 的垃圾也比使用 pool 的时候多)。
这个结论可以通过 CPU 火焰图来验证的
相似问题