顶部 – 虚拟内存大小是什么意思? …的Linux / Ubuntu的

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

虚拟内存是什么意思?

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

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

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

    地址空间(即进程列表中的虚拟内存)不花费任何东西; 这不是真的 什么是真正的RSS(RES)列,这是常驻记忆。 这就是你的实际内存占用了多less。

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

    困惑了吗? 以下是您真正需要了解的内容:使用free命令并在启动程序之前和之后检查结果(在+/- buffers/cache行上)。 不同之处在于您新启动的程序使用了多less内存。

    从顶部(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表示驻留内存(使用的物理内存)。

    其实这是不正确的(了)。 当它说“交换”,也包括程序已映射到其地址空间的文件,实际上可能实际上还在使用真正的RAM。 这个内存是文件支持的,但并不真正交换。

    VIRT还包括已经分配但尚未使用的页面。 在这个状态下的任何页面都被映射到内核的零页面(这个概念 – 你应该查看它),所以它显示在VIRT中,但是实际上并没有消耗任何内存。

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

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

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

    VIRT代表一个进程的虚拟大小,它是实际使用的内存总和,它已经映射到自己的内存(例如X服务器的video卡的RAM),映射到它的磁盘上的文件最显着的是共享库),以及与其他进程共享的内存。 VIRT代表目前程序能够访问多less内存。

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

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

    最顶层的VIRtual列,是指进程在运行时可能没有实际采用的超级空间(超级消耗空间)。 还有另外一列,即在运行时引用进程分配的实际物理内存/空间。

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

    请参阅更多信息

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

    Linux可以使用文件系统中的普通文件,也可以使用单独的分区作为交换空间。 交换分区速度更快,但更改交换文件的大小更容易(不需要重新分区整个硬盘,并可能从头开始安装)。 当你知道你需要多less交换空间时,你应该去做一个交换分区,但是如果你不确定的话,你可以先使用交换文件,使用系统一段时间,这样你就可以感觉到交换了多less需要,然后做一个交换分区,当你有信心的大小。

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

    关于操作系统术语的说明:计算机科学通常区分交换(将整个过程写入交换空间)和分页(一次只写入固定大小的部分,通常为几千字节)。 分页通常更有效率,这就是Linux所做的,但是传统的Linux术语仍然在讨论交换。

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

    我发现这个话题对于理解这个主题很有帮助: http : //www.youtube.com/watch?v = twQKAoq2OPE