代码经过预处理、编译、汇编、链接4步后生成一个可执行程序。 size xxx 可以查看程序各个分区大小 在没有运行程序前,也就是说程序没有加载到内存前,可执行程序内部已经分好三段信息,分别为代码区(text)、数据区(data)和未初始化数据区(bss)3 个部分。
type Hijacker interface { Hijack() (net.Conn, *bufio.ReadWriter, error) } //返回连接接口net.Conn和ReadWriter,bufio读写的 // Hijack lets the caller take over the connection. —–翻译Hijack让调用者管理连接
http://goog-perftools.sourceforge.net/doc/tcmalloc.html 基于Go 1.13的。 当内存不再被使用时,标准库就会自动执行Go内存管理,即从内存分配到Go自己的集合中(from allocation of the memory to its collection)。 虽然开发人员不用去和这些打交道,但是Go的内存管理做了很多优化以及有很多有趣的概念,所以也值得我们去探讨与学习。 堆上的分配 Allocation on the heap 内存管理是在高并发环境以及集成了垃圾回收功能上所设计的。我们来演示一些简单的例子: package main
过早地部署这种行为非常粗鲁,尤其是在部署时还要中断用户请求的情况下更是如此,因此,我们在Betable构建的Go服务要在不中断任何用户请求的情况下优雅地中止服务。其基本思想就是停止侦听(llistening),假定会有一个新的进程来接管这些侦听,让所有已经建立起来的连接在最终停止服务前继续处理进行中的请求。顺便说一句,我们采用了goagain,从而可以甚至在不停止侦听的情况下重启服务,但这个话题超出了本文的讨论范围。