Go 1.3 垃圾收集器未将服务器内存释放回系统
开发用于检查内存占用的服务器显示 RES 内存波动,尽管预期内存释放连接激增后。该问题的出现是由于 Go 垃圾收集器在立即释放堆内存方面的限制以及操作系统无法访问 goroutine 堆栈内存。类 Unix 系统中用于释放未使用的堆部分的系统调用在 Windows 上不可用,从而导致潜在的更大的虚拟内存消耗。
最初,服务器以较小的内存印记启动。在 10,000 个连接的初始脉冲期间,内存使用量上升到大约 60MB(如“顶部”中的 RES 大小所示)。当脉冲结束时,内存使用量减少。然而,RES 大小仍然保持在 56MB,而正在使用的内存永远不会低于 60MB。
虽然 Go 垃圾收集器释放堆内存,但它不会立即将其返回给系统。 GC 扫描后,此过程可能最多需要七分钟。此外,分配给 goroutine 堆栈的内存永远不会释放给操作系统。这导致了在服务器中观察到的持续高内存消耗。
不幸的是,Go 版本 1.3 中没有明确的解决方案来解决此问题。不过,这种情况预计会在后续版本中得到改善。为了减轻影响,请考虑以下措施:
以上是为什么 Go 1.3 在连接高峰后不将服务器内存释放回系统?的详细内容。更多信息请关注PHP中文网其他相关文章!