看虚拟机内存占用,优先用free -h,配合top或htop看实时进程,其他命令都不如这俩直观。
很多人在虚拟机上查内存,习惯打开任务管理器或者云控制台看一眼,但那个数字往往和系统里实际感受对不上,明明显示内存用了80%,可虚拟机里跑着还挺流畅,这到底是哪里出了问题?
虚拟机查看内存占用用什么命令最靠谱
先说结论:在Linux虚拟机里,free命令是查看内存总量的标准,top命令是定位内存消耗元凶的利器,Windows虚拟机则简单得多,任务管理器里的”性能”标签页数据基本准确,不需要额外折腾。
但为什么很多人觉得命令查出来的数据和云控制台对不上?因为虚拟机有内存回收机制和动态分配,控制台显示的是宿主机视角的分配量,而虚拟机内部看到的才是真正在使用的量,这不是命令的问题,是观察角度不同。
free命令怎么用才不误解
free是Linux自带的内存查看工具,几乎每个发行版都有,打开终端输入:
free -h
输出大概是这样的:
total used free shared buff/cache available Mem: 7.6Gi 2.1Gi 1.2Gi 123Mi 4.3Gi 5.0Gi Swap: 2.0Gi 0.0Gi 2.0Gi
关键看available这一列,这才是系统实际还能分配给新程序的可用内存,很多新手盯错used列,然后被吓一跳,used列包含了一部分只是”被缓存占用”但随时可以释放的内存,不代表真的不够用。
buff/cache这一列就是”伪占用”的核心,Linux内核会把空闲内存拿来做文件缓存,加速磁盘读写,当某个程序突然申请大内存时,内核会主动释放这部分缓存,所以不用手动清理。
free和top看哪个更准
free讲的是”系统整体内存水位”,top则是”哪个进程吃了内存”,两者是总分关系,不是替代关系。
top命令进入交互界面后,按Shift+M可以按内存占用排序,重点看RES列,这是进程实际占用的物理内存大小,别盯着VIRT看,那是虚拟内存,包含了共享库和映射文件,数值虚高,参考意义不大。
top -o %MEM
直接按内存占用排序启动,省去手动按键。
在top的输出里,一个进程的RES并不等于它独占的物理内存,多个进程共享同一个动态库时,RES会重复计算,想知道真实的独占内存,需要算PSS(比例集大小),可以用smem命令看,但一般排查问题用RES就够用了。
free命令和top命令哪个准确,取决于你想查什么
这个问题没有绝对答案。查系统剩余内存用free,查具体进程占用用top,不同场景选不同工具,这才是准确的前提。
云服务器内存查看命令怎么搭配用
在云服务器上排查内存问题,推荐按照这样的顺序来操作:
- 先用free -h看整体水位,判断是不是真的紧张
- 再用top -o %MEM找出排在前面的进程,看看是谁在吃内存
- 接着用ps aux –sort=-%mem | head -10快速列出Top10内存进程,适合脚本或者快速截图
ps aux --sort=-%mem | head -10
这条命令在排查”云服务器内存占用过高怎么办”时特别好用,一条命令直接给出结果,比进入top交互界面再按排序键快多了。
虚拟机的内存看宿主机还是客户机
这是个高频疑问,尤其是用过VMware或者KVM的人。宿主机和虚拟机内部看到的内存,本来就是两码事,不存在谁骗谁的问题。
- 宿主机级:看的是这个虚拟机分配了多少内存,不代表虚拟机内部真的用满了
- 虚拟机内部:看到的是操作系统实际分配和使用的内存,这才是业务程序真正感受到的
举个具体场景,你给一台虚拟机分配了8GB内存,虚拟机内部只用到3GB,那么宿主机上显示这个虚拟机的内存占用可能是5GB(包含启动时的预留和虚拟化开销),也可能更低(如果开启了内存气球),这不是异常,是虚拟化机制在起作用。
如果你在Windows虚拟机里查内存,打开任务管理器,看”内存”那一栏的”使用中”和”可用”就够了,但要注意,Windows同样有缓存机制,任务管理器里显示”已缓存”的部分,也是可以随时释放给程序的。
常见的内存命令对比,一张表看明白
| 命令 | 查看维度 | 准确度 | 适用场景 |
|---|---|---|---|
| free | 系统整体 | 高(Linux标准) | 判断内存是否够用 |
| top | 进程级别 | 较高(注意RES) | 定位谁占内存 |
| htop | 进程级别 | 较高(可视化) | 交互式排查体验更友好 |
| vmstat | 系统整体+swap | 中(偏状态采样) | 看内存变化趋势 |
| ps | 进程级别 | 中(静态快照) | 快速列表输出方便脚本化 |
htop是top的加强版,支持鼠标操作和树状图,颜色区分也更直观,但如果没有预装,需要额外装一下:
# Debian/Ubuntu sudo apt install htop # CentOS/RHEL sudo yum install htop
htop里按F6可以选排序字段,选PERCENT_MEM就按内存百分比排序了,视觉效果比top舒服不少。
虚拟机的内存占用过高,先分清是不是真的满
出现告警或者卡顿,别急着加配置,先走一套排查思路,行业内专家一致认可的做法是:
- 确认可用内存:free -h看available列,这个数字才是真实可用
- 核对缓存占比:buff/cache非常大时,不代表内存不够,只说明文件读取频繁
- 翻swap使用量:swap如果持续大量占用,说明物理内存确实吃紧,该考虑优化了
- 检查进程占比:top里找到吃掉60%以上单进程内存的程序,考虑是否合理
swap占用高说明什么
swap是磁盘划分出来模拟内存的区域。swap使用量越高,说明内存越紧张,如果虚拟机开始频繁读写swap,业务响应会明显变慢,因为磁盘速度和内存速度不在一个量级。
观察swap趋势可以用:
vmstat 1 5
每秒刷新一次,连续采样5次,看
si和so两列,如果数值持续非零,说明系统正在频繁换入换出,内存压力确实大。
这种情况下,除了增加内存配置,还要检查是否有内存泄漏的程序,用top找出长时间运行且内存只涨不降的进程,基本就是它了。
Windows虚拟机的内存查看方法
Windows下没有free命令,但任务管理器已经足够,按Ctrl+Shift+Esc直接打开,关键看”内存”图表下面的”速度”和”已使用插槽”,以及”已提交”和”已缓存”。
补充一个更专业的工具:资源监视器(resmon),性能标签页里可以按内存排序,能直接看到每个进程的”提交”和”工作集”数值,比任务管理器更详细,排查Windows虚拟机内存占用异常,用这个就够专业了。
别被数字吓住,选对维度看内存
虚拟机上查内存,最准确的做法不是找一个万能命令,而是先想清楚你要看的是”系统整体水位”还是”具体进程消耗”,整体水位用free,进程排查用top或htop,两个命令搭配,足以应对绝大多数排查场景。 那些控制台上显示的数字,理解成”宿主机视角的分配”,心里有数就行。
大家常问的虚拟机内存查看问题
虚拟机执行free命令显示可用内存很少,但系统不卡,是什么原因
这是buff/cache在起作用,文件缓存占用的部分在内核需要时会自动释放,不需要手动干涉。判断内存够不够用,以available列为准,不是看free列。
top命令里VIRT和RES两个数值哪个才能真正反映进程占用的内存
RES(驻留内存)更接近实际占用,VIRT包含进程申请的虚拟地址空间,其中很大一部分从未被真正加载到物理内存里,不过RES也包含了进程间共享的库文件,如果追求精确,需要借助smem查看PSS值。
云控制台显示的内存用量和free命令查出来的数值不一致,这是不是被坑了
不是,云控制台的数据来自宿主机Hypervisor,它统计的是虚拟机从宿主机分配走的物理内存,包括内核预留和虚拟化开销,而虚拟机内部的free命令统计的是客户机操作系统视角下的使用情况,两者统计维度不同,结果自然有差异,属于正常现象。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/623815.html





