先上图:

搜了下网络,都说虚拟内存用的交换分区,可我这交换分区一点都没使用,程序占用的虚拟内存高的吓人,它到底占据了哪儿?
先上图:

搜了下网络,都说虚拟内存用的交换分区,可我这交换分区一点都没使用,程序占用的虚拟内存高的吓人,它到底占据了哪儿?
这个虚拟内存, 不是swap,应对应的是top命令的VIRT;
VIRT -- Virtual Image (kb)
The total amount of virtual memory used by the task. It
includes all code, data and shared libraries plus pages that
have been swapped out and pages that have been mapped but not
used.
这玩意的解释可以参考:
复制一个翻译:
虚拟内存甚至不一定是内存。例如,如果一个进程将一个大文件内存映射,这个文件实际上是存储在磁盘上的,但它仍然会占用进程的“地址空间”。
地址空间(即进程列表中的虚拟内存)并不消耗任何资源;它是虚拟的。真正消耗资源的是 RSS(RES)列,也就是驻留内存。这表示进程实际占用了多少内存。
但这还不是全部。如果一个进程调用了 fork(),它会分裂成两个进程,这两个进程起初会共享所有的 RSS。所以即使 RSS 最初是 1 GB,在 fork 后会变成两个进程,每个进程的 RSS 都是 1 GB,但你仍然只使用了 1 GB 的内存。
现在弄糊涂了吧?下面是真正需要知道的:使用 free 命令,并在启动你的程序前后检查结果(在 +/- buffers/cache 行)。这个差值就是你的程序新启动时所使用的内存量。
你说的的 VIRT,只要程序申请的内存都会算在里面,即使没被实际使用。而不少软件为了优化,会在启动时先申请一大块内存等待后续使用
打开top,比较了一下,应该就是了
在堆上申请了地址,但不一定写入了数据,笼统一点就是申请的可分配空间。有可能用了也可能没用。
冒昧提个建议,大段文本建议用 Markdown 中的引用,不要用代码块。代码块虽然方便直接复制,但是如果一行比较长,则会被折叠,而不会自动换行,阅读体验不好。
用引用的话,长行是可以自动换行的。代码如下:
> 虚拟内存甚至不一定是内存。例如,如果一个进程将一个大文件内存映射,这个文件实际上是存储在磁盘上的,但它仍然会占用进程的“地址空间”。
>
> 地址空间(即进程列表中的虚拟内存)并不消耗任何资源;它是虚拟的。真正消耗资源的是 RSS(RES)列,也就是驻留内存。这表示进程实际占用了多少内存。
>
> 但这还不是全部。如果一个进程调用了 fork(),它会分裂成两个进程,这两个进程起初会共享所有的 RSS。所以即使 RSS 最初是 1 GB,在 fork 后会变成两个进程,每个进程的 RSS 都是 1 GB,但你仍然只使用了 1 GB 的内存。
>
> 现在弄糊涂了吧?下面是真正需要知道的:使用 free 命令,并在启动你的程序前后检查结果(在 +/- buffers/cache 行)。这个差值就是你的程序新启动时所使用的内存量。
渲染效果是:
虚拟内存甚至不一定是内存。例如,如果一个进程将一个大文件内存映射,这个文件实际上是存储在磁盘上的,但它仍然会占用进程的“地址空间”。
地址空间(即进程列表中的虚拟内存)并不消耗任何资源;它是虚拟的。真正消耗资源的是 RSS(RES)列,也就是驻留内存。这表示进程实际占用了多少内存。
但这还不是全部。如果一个进程调用了 fork(),它会分裂成两个进程,这两个进程起初会共享所有的 RSS。所以即使 RSS 最初是 1 GB,在 fork 后会变成两个进程,每个进程的 RSS 都是 1 GB,但你仍然只使用了 1 GB 的内存。
现在弄糊涂了吧?下面是真正需要知道的:使用 free 命令,并在启动你的程序前后检查结果(在 +/- buffers/cache 行)。这个差值就是你的程序新启动时所使用的内存量。
VIRT对应的是虚拟内存,和实际占用的物理内存没有直接关系。
使用free -mh看一下内存占用,关注available和swap的大小,如果available很少,并且swap占用很多,那么内存占用就比较高,如果available比较大,swap占用的很少,那内存很健康。