顶部的虚拟内存大小是什么意思?

kap*_*pso 153 virtualization linux memory top

我正在运行top以监控我的服务器性能,我的 2 个 java 进程显示高达 800MB-1GB 的虚拟内存。那是一件坏事?

虚拟内存是什么意思?

哦顺便说一句,我交换了 1GB,它显示使用了 0%。所以我很困惑。

Java 进程 = 1 个 Tomcat 服务器 + 我自己的 Java 守护进程服务器 = Ubuntu 9.10 (karmic)

小智 173

虚拟内存甚至不一定是内存。例如,如果一个进程内存映射一个大文件,该文件实际上存储在磁盘上,但它仍然占用进程中的“地址空间”。

地址空间(即进程列表中的虚拟内存)不需要任何费用;这不是真的。真正的是RSS(RES)列,它是常驻内存。这就是进程占用的实际内存量。

但即使这也不是全部答案。如果一个进程调用 fork(),它会分成两部分,并且它们最初共享所有的 RSS。因此,即使 RSS 最初是 1 GB,分叉后的结果将是两个进程,每个进程的 RSS 为 1 GB,但您仍然只使用 1 GB 的内存。

还糊涂?以下是您真正需要知道的:free在启动程序之前和之后(+/- buffers/cache在线)使用命令并检查结果。区别在于您新启动的程序使用了多少内存。

  • “在启动程序之前和之后检查结果”,或者,使用 `smem` 返回的 USS(唯一设置大小)。 (2认同)

amp*_*ine 28

顶部(1)手册页

o: VIRT -- 虚拟映像 (kb)

任务使用的虚拟内存总量。它包括所有代码、数据和共享库以及已换出的页面和已映射但未使用的页面。

有关其他详细信息,请参阅“概述,Linux 内存类型”。

(文档的先前版本指出“VIRT = SWAP + RES。”其中 RES 表示 RESident 或使用的物理内存。)

实际上这是不正确的(不再)。当它说“交换”时,还包括程序已映射到其地址空间的文件,这些文件实际上可能正在或可能尚未消耗实际 RAM。这个内存是文件支持的,但不是真正的交换。

VIRT 还包括已分配但尚未用于任何内容的页面。这种状态下的任何页面都映射到内核零页(绝妙的概念——你应该查一下),所以它显示在 VIRT 中,但实际上并不消耗任何内存。

  • @user42159 这个答案是错误的!男士上衣没有“VIRT = SWAP + RES”!`-m : VIRT/USED 切换报告 USED(进程 rss 和交换总计数的总和)而不是 VIRT`。很遗憾,我不能对这个答案投反对票。 (16认同)
  • 这个答案是不正确的。USED​​ = Res+Swap Size(来自顶部字段管理,在顶部时按 f 键访问。也来自顶部手册页)。 (3认同)
  • 嗯,这很有趣,VIRT = SWAP + RES 也是如此,为什么我的 SWAP 使用量为零,而 2 个 java 进程的虚拟内存接近 1GB?? (2认同)

Fra*_*urt 23

我发现Mugurel Sumanariu 的这个解释非常清楚:

VIRT代表进程的虚拟大小,它是它实际使用的内存、它映射到自身的内存(例如 X 服务器的视频卡的 RAM)、已映射到它的磁盘上的文件(大多数尤其是共享库),以及与其他进程共享的内存。VIRT 表示程序当前能够访问的内存量。

RES代表常驻大小,这是一个进程消耗多少实际物理内存的准确表示。(这也直接对应于 %MEM 列。)这实际上总是小于 VIRT 大小,因为大多数程序依赖于 C 库。

SHR表示实际可共享的 VIRT 大小(内存或库)。在图书馆的情况下,并不一定意味着整个图书馆都是常驻的。例如,如果一个程序只使用了一个库中的几个函数,则整个库被映射并计入 VIRT 和 SHR 中,但只有包含正在使用的函数的库文件的部分才会被实际加载并计入在 RES 下。

  • 我可能只会重新表述“VIRT 表示程序当前能够访问多少内存。” 类似于“VIRT 表示当前程序整个可寻址空间的大小”。好的,那仍然可以使用波兰语。但关键是,当 VIRT 与 RAM 空间没有任何关系时,“多少内存”仍然可以给人一种我们正在讨论 RAM 的印象。事实上,大型程序的 VIRT 大小通常是整个系统 RAM 大小的几倍——因为 VIRT 几乎完全是文件支持的地址区域(又名“磁盘而不是 RAM”)。 (3认同)

leo*_*loy 5

ps/top 输出中的 VIRT 列几乎与测量内存使用无关。别担心。 Apache 重载 VIRT 与 RES 内存

/sf/ask/39287181/