free -m
在我的系统中显示以下内容:
total used free shared buffers cached
Mem: 3954 3842 111 0 248 2585
-/+ buffers/cache: 1008 2945
Swap: 3811 4 3807
所以内存看起来已经用完了,但top
按内存排序显示了以下顶级进程:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8891 minecraf 20 0 2374m 277m 9.9m S 1 7.0 0:12.21 java
8704 root 39 19 2802m 272m 11m S 0 6.9 0:28.73 java
java使用的虚拟内存似乎很大,但我在网上了解到这不是问题。所以我想我的问题是:free
如果没有那么有意义,为什么要显示虚拟内存?
答案1
“Mem”行free
不显示虚拟内存使用情况,它显示物理内存使用情况。
中的“RES”(针对居民)和“%MEM”列向top
您显示相同的内容:身体的每个进程正在使用的内存。
free
做显示可用和已用交换空间,并top
具有“VIRT”列,两者都很重要。粗略地说,交换空间加上物理内存就是您可能的总虚拟内存空间。达到该限制,您将开始杀死进程或无法分配内存,事情会很糟糕。
答案2
由于您可以将虚拟内存映射到文件或库,因此 VIRT 数量可能非常大。我正在运行一个小型 Java 应用程序,它使用 ~6g VIRT 内存,但 RESident 为 59m。
java使用的虚拟内存似乎很大,但我在网上了解到这不是问题
虚拟内存不那么重要的原因是,当不使用它或需要空闲驻留内存时,它会被分页到交换空间(硬盘存储)。交换空间中的东西去那里是有原因的;因为它很少使用(或者根本不使用,但只是在某处引用)。如果您使用的是 64 位操作系统,您可以处理比您使用的更多的地址,而让虚拟内存管理器担心。
这篇博文对编程中的虚拟内存有一些评论:http://antirez.com/post/what-is-wrong-with-2006-programming.html
首先,您不应该将频繁使用的数据从 RAM 交换到 HDD,这就是为什么您被告知 Java 分配大量内存不是问题。