加入收藏 | 设为首页 | 会员中心 | 我要投稿 唐山站长网 (https://www.0315zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 评论 > 正文

智慧城市将创造2.46万亿美元的商业机会

发布时间:2021-02-06 13:47:23 所属栏目:评论 来源:互联网
导读:Go FAQ 接着我第一反应是去翻了 Go FAQ(因为看到过,有印象),其问题为 Why does my Go process use so much virtual memory?,回答如下: The Go memory allocator reserves a large region of virtual memory as an arena for allocations. This virtual m

Go FAQ

接着我第一反应是去翻了 Go FAQ(因为看到过,有印象),其问题为 "Why does my Go process use so much virtual memory?",回答如下:

The Go memory allocator reserves a large region of virtual memory as an arena for allocations. This virtual memory is local to the specific Go process; the reservation does not deprive other processes of memory.

To find the amount of actual memory allocated to a Go process, use the Unix top command and consult the RES (Linux) or RSIZE (macOS) columns.

这个 FAQ 是在 2012 年 10 月 提交 的,这么多年了也没有更进一步的说明,再翻了 issues 和 forum,一些关闭掉的 issue 都指向了 FAQ,这显然无法满足我的求知欲,因此我继续往下探索,看看里面到底都摆了些什么。

查看内存映射

在上图中,我们有提到进程虚拟内存,主要包含了你的代码、数据、堆、栈段和共享库,那初步怀疑是不是进程做了什么内存映射,导致了大量的内存空间被保留呢,为了确定这一点,我们通过如下命令去排查:
 

从结果上来看,VSZ 为 4297048K,也就是 4G 左右,咋一眼看过去还是挺吓人的,明明没有什么业务逻辑,但是为什么那么高呢,真是令人感到好奇。

确认有没有泄露

在未知的情况下,我们可以首先看下 runtime.MemStats 和 pprof,确定应用到底有没有泄露。不过我们这块是演示程序,什么业务逻辑都没有,因此可以确定和应用没有直接关系。
 

虚拟内存的重要能力

为了更有效地管理内存并且减少出错,现代系统提供了一种对主存的抽象概念,也就是今天的主角,叫做虚拟内存(VM)。

虚拟内存是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件交互的地方,它为每个进程提供了一个大的、一致的和私有的地址空间,虚拟内存提供了三个重要的能力:

它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。

它为每个进程提供了一致的地址空间,从而简化了内存管理。

它保护了每个进程的地址空间不被其他进程破坏。

小结

上面发散的可能比较多,简单来讲,对于本文我们重点关注这些知识点,如下:

  • 虚拟内存它是有各式各样内存交互的地方,它包含的不仅仅是 "自己",而在本文中,我们只需要关注 VSZ,也就是进程虚拟内存,它包含了你的代码、数据、堆、栈段和共享库。
  • 虚拟内存作为内存保护的工具,能够保证进程之间的内存空间独立,不受其他进程的影响,因此每一个进程的 VSZ 大小都不一样,互不影响。
  • 虚拟内存的存在,系统给各进程分配的内存之和是可以大于实际可用的物理内存的,因此你也会发现你进程的物理内存总是比虚拟内存低的多的多。

排查问题

在了解了基础知识后,我们正式开始排查问题,第一步我们先编写一个测试程序,看看没有什么业务逻辑的 Go 程序,它初始的 VSZ 是怎么样的。

测试

应用代码:

(编辑:唐山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读