我正在使用 free -lh 命令检查我的内存使用情况,它显示了以下结果。
total used free shared buffers cached
Mem: 62G 29G 33G 278M 335M 19G
Low: 62G 29G 33G
High: 0B 0B 0B
-/+ buffers/cache: 9.1G 53G
Swap: 15G 0B 15G
正如我所看到的,已用内存为 29GB,可用内存为 33GB,但当我检查相同的 usingtop
命令时,它会显示以下输出。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
23555 glassfi+ 20 0 19.896g 5.270g 55092 S 0.0 8.4 121:16.24 java
2457 hg+ 20 0 20.294g 981344 20588 S 0.0 1.5 6:00.18 java
2615 hg+ 20 0 20.294g 950520 20560 S 0.0 1.4 0:22.18 java
1992 tomcat6 20 0 5783768 518860 20976 S 0.0 0.8 8:05.15 java
.................................................
从上面的结果我可以看到 glassfish 使用 19GB RAM,hg+ 使用 20GB RAM,这意味着使用了超过 39GB RAM。
我的问题是为什么 free -lh 命令显示仅使用 29GB RAM
答案1
“VIRT”列显示进程有多少内存已分配,而不是他们实际使用了多少。进程可以分配比它们使用的更多的内存;对于倾向于分配大堆但不一定使用所有内容的 Java 进程来说尤其如此。 “RES”列显示了他们使用了多少空间:进程使用了 5GiB 以上glassfish
,每个进程使用了不到 1GiB hg
。