题 顶部 - 虚拟内存大小是什么意思? ...的Linux / Ubuntu的


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

虚拟内存是什么意思?

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

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


99
2018-05-04 15:37




看到: serverfault.com/questions/48582/... - Juliano


答案:


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

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

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

困惑了吗?这是你真正需要知道的:使用 free 命令并在启动程序之前和之后检查结果(在 +/- buffers/cache 线)。这个差异是多少  记忆您新启动的程序。


119
2018-05-05 01:17



“在启动程序之前和之后检查结果”,或者使用返回的USS(唯一集合大小) smem。 - Hubert Kario
那么是否有一个工具可以提供真正的内存使用量,而不是第三方的工具。 - CMCDragonkai
@CMCDragonkai是的,免费。 - deviantfan
如果我通过启动java进程 java -Xmx16g RunLong,这将为Java进程保留16Gb内存,然后在 VIRT 在顶部,似乎计算了16Gb。在这种情况下,这个16Gb内存的类型是映射内存还是......? - Eric Wang


从顶部(1)手册页:

o: 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.

      VIRT = SWAP + RES.

其中RES表示RESident内存(使用的物理内存)。

实际上这是不正确的(不再)。当它表示“交换”时,它还包括程序已映射到其地址空间的文件,这些文件可能实际上也可能没有消耗真正的RAM。此内存是文件支持的,但实际上并不是交换。

VIRT还包括已分配但尚未用于任何内容的页面。处于此状态的任何页面都映射到内核零页面(精彩概念 - 您应该查找它),因此它显示在VIRT中但实际上并不消耗任何内存。


22
2018-05-04 15:43



这很有意思,VIRT = SWAP + RES也是如此,我的SWAP使用率为零,而2个java进程的虚拟内存接近1GB? - kapso
基本上显示....交换:1048568k总计,0k使用,1048568k免费,505728k缓存 - kapso
@ user42159这个答案错了​​!男人顶上没有'VIRT = SWAP + RES'! -m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT。遗憾的是,我无法回答这个问题。 - duleshi
这个答案是不正确的。 USED​​ = Res +交换大小(来自顶级字段管理,在顶部时按f键访问。也从顶部手册页)。 - Jason S


我找到了这个 来自Mugurel Sumanariu的解释 非常清楚:

VIRT 代表进程的虚拟大小,它是总和   它实际上正在使用的内存,它已映射到自身的内存(for   例如,X服务器的视频卡的RAM),磁盘上的文件   已被映射到它(最着名的是共享库)和内存   与其他进程共享。 VIRT代表了多少内存   程序目前能够访问。

RES 代表居民规模,这是一个准确的代表   一个进程消耗多少实际物理内存。 (这也是   直接对应于%MEM列。)这实际上总是如此   小于VIRT大小,因为大多数程序依赖于C   图书馆。

SHR 表示VIRT大小实际可共享多少(内存   或图书馆)。就图书馆而言,并不一定意味着   整个图书馆都是居民。例如,如果只是一个程序   使用库中的一些函数,整个库被映射和   将计入VIRT和SHR,但仅限于图书馆的部分   实际上将加载包含正在使用的函数的文件   并计入RES。


8
2018-01-27 17:53





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

https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used


5
2018-05-04 15:41



谢谢,我很担心和困惑,因为当交换使用率为0%时,虚拟内存列非常高。而且我只使用了1.7GB的2.7GB物理内存,而虚拟内存很高? - kapso


Linux支持虚拟内存,即使用磁盘作为RAM的扩展,以便可用内存的有效大小相应增长。内核会将当前未使用的内存块的内容写入硬盘,以便内存可用于其他目的。当再次需要原始内容时,它们将被读回内存。这一切都对用户完全透明;在Linux下运行的程序只能看到更大的可用内存,并且不会注意到它们中的一部分会不时驻留在磁盘上。当然,读取和写入硬盘比使用实际内存要慢(大约慢一千倍),因此程序运行速度不快。用作虚拟内存的硬盘部分称为交换空间。

Linux可以使用文件系统中的普通文件,也可以使用单独的分区来交换空间。交换分区更快,但更改交换文件的大小更容易(不需要重新分区整个硬盘,并且可能从头开始安装所有内容)。当你知道你需要多少交换空间时,你应该去交换分区,但是如果你不确定,你可以先使用交换文件,使用系统一段时间,这样你就可以了解交换多少需要,然后在你对它的大小有信心时进行交换分区。

您还应该知道Linux允许一个人同时使用多个交换分区和/或交换文件。这意味着如果您偶尔需要一个不寻常的交换空间,您可以在这些时间设置一个额外的交换文件,而不是一直保持分配的全部金额。

关于操作系统术语的说明:计算机科学通常区分交换(将整个过程写入交换空间)和分页(一次仅写入固定大小的部分,通常是几千字节)。分页通常更有效率,这就是Linux的功能,但传统的Linux术语无论如何都要谈论交换。

资源: http://www.faqs.org/docs/linux_admin/x1752.html


2
2018-05-04 15:43



这个答案传播了一种误解,即虚拟内存与交换或分页相同。使用磁盘作为RAM的扩展比虚拟内存更早。并且有许多系统(例如大多数SoHo路由器)具有虚拟内存但不使用磁盘作为RAM的扩展。 (这也不是OP问题的答案,因为他没有使用任何交换。) - David Schwartz


VIRtual top的列,指的是进程的超级空间(超级消耗空间),该进程可能在运行时实际上没有进行。还有另一栏 RESident,它指的是在运行时由进程分配的实际物理内存/空间。

两者之间的差异的原因可以通过示例来理解:如果进程使用某个库,那么库大小,也将有助于 virtual-size。但是,因为只使用了库的一部分(即使用的某些方法),所以这将有助于 resident-size

请参阅 更多信息


2
2018-02-26 14:27





“VIRT”只是地址空间,RES是“真实”存储器,但“SHR”(=共享)量“RES”是RES与其他进程共享的部分。因此,对于大多数进程,我认为通过从RES中减去SHR可以获得真正归因于此特定进程的内存量。


0
2018-04-18 23:03