当程序在golang中退出时,泄漏的内存是否被释放?

时间:2018-06-29 05:24:16

标签: go

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

1 个答案:

答案 0 :(得分:5)

您似乎应该提高对当代计算机系统工作原理的了解,这可能有助于使用Go之类的语言,与其他主流解决方案相比,它们在某种程度上“更接近金属”。

问题是,当前Go可以在其上运行的商品平台(也许WebAssembly除外,它可以在通常由Web浏览器提供的高级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编写,可在一种操作系统上运行 去支持,存在两个级别的内存管理:

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

Go程序询问Go运行时,该运行时为其分配动力 内存(需要时)和垃圾收集器(再次) 是Go运行时的一部分,不时回收 未使用的内存返回到已维护的内存池 在运行时。从本质上讲,“释放”的内存 当Go程序正在运行时,它将停留在该程序中, 当再次需要它时,Go运行时将尝试 从池中分配它。

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

当然,内存不仅会从内核流到 Go运行时:后者具有标记内存页的机制 它在闲置的时间内保持空闲状态,因此内核是 可以在适当时(通常在 系统会承受内存压力。


我要说的是,您应该读一两本书,了解典型的操作方式 系统有效。