Memory 分配是如何工作的,您如何防止它们?

Memory 分配是如何工作的,您如何防止它们?,memory,go,Memory,Go,go test工具有一个分析器,它可以告诉您在代码中所做的分配量。 但是,看到这样的库: 正在声明“热路径中的零内存分配”。。。这是什么意思?你是如何在围棋中做到这一点的?我个人不喜欢他们使用语言,因为这听起来像是营销人员会说的话。。。他们的意思是,在该代码中不会发生分配,因为已经预先分配了一个缓冲区,以便在那里使用 因此,明确地说,它们的意思是“在这个有限的范围内不会发生分配”。你是如何做到这一点的?通过提前分配足够大的缓冲区,然后在范围内利用它 软件包作者的意图是通过预先分配来加速请求处理,

go test工具有一个分析器,它可以告诉您在代码中所做的分配量。 但是,看到这样的库:
正在声明“热路径中的零内存分配”。。。这是什么意思?你是如何在围棋中做到这一点的?

我个人不喜欢他们使用语言,因为这听起来像是营销人员会说的话。。。他们的意思是,在该代码中不会发生分配,因为已经预先分配了一个缓冲区,以便在那里使用

因此,明确地说,它们的意思是“在这个有限的范围内不会发生分配”。你是如何做到这一点的?通过提前分配足够大的缓冲区,然后在范围内利用它

软件包作者的意图是通过预先分配来加速请求处理,而代价是使用更多内存(或者至少在内存上有一个更稳定的保持,理论上缓冲区的大小可以与需要分配的大小相同)

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