每日一博 | 为什么 Go 占用那么多的虚拟内存?
前段时间,某同学说某服务的容器因为超出内存限制,不断地重启,问我们是不是有内存泄露,赶紧排查,然后解决掉,省的出问题。 我们大为震惊,赶紧查看监控+报警系统和性能分析,发现应用指标压根就不高,不像有泄露的样子。 问题到底是出在哪里了呢,我们进入某个容器里查看了 top 的系统指标: PIDVSZRSS...COMMAND674592007m136m..../eddycjy-server 看上去也没什么大开销的东西,就一个 Go 进程?就这? 再定眼一看,某同学就说 VSZ 那么高,而某云上的容器内存指标居然恰好和 VSZ 的值相接近,因此就怀疑是不是 VSZ 所导致的,觉得存在一定的关联关系。 这个猜测的结果到底是否正确呢? 基础知识 本篇文章将主要围绕 Go 进程的 VSZ 来进行剖析,看看到底它为什么那么 "高"。 第一节为前置的补充知识,大家可按顺序阅读。 什么是 VSZ VSZ 是该进程所能使用的虚拟内存总大小,它包括进程可以访问的所有内存,其中包括了被换出的内存(Swap)、已分配但未使用的内存以及来自共享库的内存。 为什么要虚拟内存 在前面我们有了解到 VSZ 其实就是该进...
