Go 和虚拟内存

283 阅读1分钟

Go 运行时在很多方面都依赖虚拟内存的成本特性:

  • Go 运行时不会删除已经映射的虚拟内存。相反,它会利用多数操作系统提供的专用接口来精确释放特定虚拟内存空间关联的物理内存。
    Go 运行时在维护内存上限和向操作系统归还不用的内存时都会使用这种技术。Go 运行时还会在后台不间断地释放自己用不到的内存。

  • 在 32 位平台上,Go 运行时会在堆的预留地址空间中预留 128 MiB 到 512 Mib 的地址空间用来减少内存碎片问题。

  • 在 Go 的内部实现中,有多个内部的数据结构都会预留大量的虚拟内存地址空间。在 64 位平台上,这些预留空间大约有 700 MiB。在 32 位平台上,预留空间可以忽略不记。

所以通过top的”VSS”字段展示的虚拟内存指标对理解 Go 程序的内存占用没有太大帮助。相反,我们应该关注”RSS”和同类指标,它们才能更为直接地反映物理内存的使用情况。