2014-10-22 162 views
6

我正在使用512MB RAM和足够的交换内存来支持应用程序的嵌入式系统。在内核中,我将内核cmd参数的RAM大小限制为130MB。并使用swapoff -a禁用交换。我还禁用了内核过度使用,以便应用程序可以单独运行在物理内存中。我验证了/proc/cmdline/proc/meminfo的更改。现在,当我运行应用程序并检查最高值时,我的应用程序的VSZ是177m,比实际内存更多!这怎么可能?这个记忆从哪里来的?为什么在Linux中内存使用量超过物理内存?

+2

内存映射文件?相同的内存在虚拟地址空间中映射两次?检查进程内存映射。 – 2014-10-22 05:47:06

+0

http://linuxatemyram.com/和'/ proc/$ PID/maps' – 2014-10-22 06:44:24

回答

6

VSZ是进程使用的虚拟内存大小。这是正常的,它高于你的物理记忆的大小,因为这是这个主要想法之一。你应该看看Resident size(RSS),它是进程使用的实际物理内存。

请看下面的例子:

我有一个nginx的过程运行:

ps -o rss,vsz,cmd ax | grep -i nginx | head -n1 
    956 31248 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf 

rss - 956 kB 
vsz - 31248 kB 

所以,这意味着该过程使用的物理存储器956KB,和虚拟内存的31MB。

与您一样,禁用swap(swapoff -a)不会禁用虚拟内存。

阅读有关虚拟内存的位置: Virtual memory

+0

是否可以对虚拟内存设置限制?我只是好奇...... – Griffin 2014-10-23 09:06:21

+0

我不认为你解释了为什么'swapoff -a'不会导致VMM的使用。 * swap *仅用于*读写*存储器或程序数据。对于程序代码,Linux *虚拟文件系统*可以定位(重新加载)页面。如果代码跳转到一个地址,那么代码*故障*并且数据从磁盘加载。这样,当一个程序启动时,整个事物不会加载到内存中;只有*开始*地址页面。同样在内存压力下,很少使用的代码可能会碰撞。 – 2014-11-04 19:27:11

相关问题