为何htop/top显示的常驻内存(Resident Memory)占用量超出机器物理内存?
为何htop/top显示的常驻内存(Resident Memory)占用量超出机器物理内存?
嘿,这情况我刚碰到的时候也直接懵了——怎么加起来的内存比我机器实际有的还多?其实核心原因就是共享内存被重复计算了,给你掰扯明白:
- 首先得搞懂
top/htop里的RES(常驻内存)是什么:它统计的是每个进程当前加载到物理内存里的内存大小,但这里面包含了共享内存段(比如系统通用库、进程间共享的内存区域)。 - 问题就出在共享内存的统计逻辑上:如果有N个进程都用到了同一块共享内存(比如几乎所有进程都会依赖的
libc.so),那这块内存在物理内存里只存一份,但top/htop会给每个进程的RES都加上这块内存的大小,相当于把同一份内存数了N次。 - 对比
free命令的结果就清楚了:free里的used是系统实际消耗的物理内存,它会把共享内存只算一次,所以你看free的数值是正常的,但top/htop所有进程RES加起来就会远超物理内存总量。 - 再看
pmap的输出,里面会明确标记出每个进程内存里的shared部分,这些就是被重复统计的内容——把所有进程的非shared私有内存加起来,再加上所有唯一的shared共享内存部分,总和才会和free的used数值对应上。
举个简单例子:假设你有2个进程,都用了100M的共享库,每个进程自己还有50M的私有内存。那每个进程的RES是150M,加起来300M,但实际物理内存只用到了50+50+100=200M,这就出现了总和超物理内存的“假象”。
备注:内容来源于stack exchange,提问作者nh2
相关产品推荐
相关产品推荐

