当程序在 golang 中退出时,泄漏的内存会释放吗?



在你重复提问之前,我已经阅读了所有这些答案,但我的问题集中在 golang 特定。 用戈朗谚语 不要通过共享记忆来交流;通过交流共享内存我想知道 golang 管理内存的方式是否有不同

看来你应该完善你对当代计算机系统如何工作的了解——这可能有助于使用 Go 等语言,这些语言比其他一些主流解决方案相当"更接近金属"。

问题是,当前运行Go的商品平台(WebAssembly除外,它运行在通常由Web浏览器提供的高级VM上(做了两件与所讨论的问题相关的事情:完全"包含"它们正在执行的进程,并提供给它们所谓的 虚拟内存管理。

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

因此,内核拥有分配给它管理的每个进程的所有资源的完整和准确的帐户。 因此,当进程由于某种原因完成执行时, 内核在它之后清理:关闭文件和套接字描述符 仍然打开,释放其他资源并回收提交到进程的内存。

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


其余部分,仅与 你问题的本质,但无论如何可能会有所帮助 想想是内存管理。

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

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

Go程序询问 Go 运行时,它分配 内存,在需要时,以及垃圾回收器,再次 是 Go 运行时的一部分,不时回收 未使用的内存返回到内存池中保留 由运行时。本质上,被"释放"的记忆 当 Go 程序运行时,将留在程序中, 当再次需要它时,Go 运行时将尝试 从其池中分配它。

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

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


我想说,你应该读一两本关于典型操作方式的书 系统工作正常。

最新更新