分配如何工作以及如何防止它们?

时间:2016-04-29 20:23:16

标签: memory go

go测试工具有一个分析器,可以告诉您在代码中执行的分配量。 但是,看到这样的库: https://github.com/valyala/fasthttp 陈述"热路径中的零内存分配" ......这是什么意思?你如何在Go中实现这一目标?

1 个答案:

答案 0 :(得分:4)

我个人不喜欢他们使用语言,因为这听起来像营销人员会说的......他们所说的一切都是因为预先分配了一个缓冲区,因此在该代码中不会发生任何分配在那里使用。

所以要明确,他们的意思是在这个有限的范围内不会发生任何分配'你是如何实现这一目标的?通过在此之前分配足够大的缓冲区,然后在范围内利用它。

软件包作者的意图是通过以使用更多内存为代价预先分配请求来加速请求处理(或者至少对内存保持更持久,理论上缓冲区的大小可以与什么需要分配)。

如果您对实现细节感到好奇,请查看byte_buffer.go和args.go等文件,您会发现事先分配了一个缓冲区对象池,以便处理程序代码不必为响应主体等进行分配。相反,您从池中获取缓冲区(已分配)并将响应数据写入其中,然后在您完成后将其释放回池中以便重复使用。在标准方案中,您可以为响应主体分配空间,并在返回响应后,该对象将离开范围并释放内存。正如我在上面的段落中所提到的,将所有这些预先移动意味着当您的服务启动时,它将获得并保存比使用net / http的类似服务更大的内存,因为它将根据需要获取并释放内存基础。