go - golang程序退出时泄漏的内存是否被释放?

标签 go

<分区>

在您申请重复之前 question ,我已经阅读了所有这些答案,但我的问题是针对特定于 golang 的。 用 golang 谚语 Don't communicate by sharing memory; share memory by communicating我想知道 golang 管理内存的方式是否有所不同

最佳答案

看来您应该加深对当代计算机系统工作原理的了解——这可能有助于使用 Go 等语言,这些语言比其他一些主流解决方案“更接近金属”。

事实是,当前运行 Go 的商品平台(也许 WebAssembly 除外——它运行在通常由网络浏览器提供的高级 VM 上)做了两件与所讨论的问题相关的事情:完全“包含”进程他们正在执行,并向他们提供所谓的 virtual memory management .

前者是指商品内核运行的进程 操作系统(基于 Linux 或 *BSD、Windows、Mac OS X 等)无法 在不要求底层内核这样做的情况下做任何有用的事情 代表该进程。也就是说,该进程实际上并不分配内存或打开文件或通过 TCP 套接字发送字节——它要求内核这样做。

因此,内核对分配给它管理的每个进程的所有资源都有完整而准确的说明。 因此,当一个进程由于某种原因结束执行时, 内核在它之后清理:关闭文件和套接字描述符 仍处于打开状态,释放其他资源并回收 提交给进程的内存

所以你的问题的直接答案是:当然,是的, 这绝不取决于过程是如何进行的 已实现(也就是说,它是用 C 还是 Go 编写的 或在 Java 中——因此由 Java VM 运行并在 从字节码到真正的 CPU 指令,或者在 JavaScript 中并由 Node.js 执行,或者在 Python 中——因此 内核实际上并没有执行你的 Python 代码,但实际上 Python 解释器的代码,等等)——内核 在执行时甚至没有“看到”所有这些差异 CPU指令和执行 syscalls 由进程创建(再次使用 CPU 指令)。


剩下的部分,只与切线相关 你问题的本质,但无论如何可能对 想想内存管理。

问题是,如果我们考虑一个执行程序的进程 用在其中一个操作系统上运行的 Go 编写 Go 支持,存在两级内存管理:

  1. 底层,由内核提供,
  2. 高级,由 Go 运行时提供(即 链接到任何用 Go 编写的正在运行的程序)。

Go 程序询问 Go 运行时,它为其分配资源 内存,在需要的时候,还有垃圾收集器,这又是 是 Go 运行时的一部分,不时回收 未使用的内存返回内存池维护 由运行时。本质上,被“释放”的内存 当一个 Go 程序运行时停留在程序中, 当再次需要它时,Go 运行时将尝试 从它的池中分配它。

仅当 Go 运行时的内存管理器没有足够空闲时 内存,它会到达操作系统并在那里分配内存吗? 参与另一层内存管理。

当然,内存不仅仅从内核流向 Go运行时:后者有标记内存页的机制 它在未使用的情况下保持空闲时间过长,因此内核 在它认为合适的时候可以自由回收它们(通常是 系统承受内存压力)。


我会说,你应该读一两本书,了解典型的运营方式 系统工作。

关于go - golang程序退出时泄漏的内存是否被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51094795/

相关文章:

json - 将 io.ReadCloser 转换为字节数组的最有效方法

go - Go 中的函数类型

url - Base64 编码的 uuid 比预期的要长

go - 如何使用连接池到 aerospike 服务器

go - Beego 模板渲染部分

Go switch vs if-else效率

c++ - 如何痛饮省略前向声明

go - 避免与在 go 中返回 2 个值的函数一起嵌套?

Golang 对类型数组中 slice 字段的引用

go - 未导入 Github 分支中的更改