当服务器提示虚拟内存不足时,最直接的应对是快速调大系统交换空间并定位高内存进程,但想彻底解决,必须从应用内存泄漏、物理内存容量、系统交换策略三个方向同时排查,否则问题会反复出现。
服务器跟普通电脑不一样,内存一紧张,影响的不是一个软件,而是所有跑在上面的服务,虚拟内存不足这个问题,看着是系统提示,但实际上反映的是整台机器的运行状态出了问题,接下来按照从现象到原因、再从应急到预防的顺序,把这个问题拆开讲。
虚拟内存不足是怎么来的?先搞懂原理才不会乱调参数
要解决虚拟内存不足,先得知道这个东西的本质是什么,操作系统设计虚拟内存的初衷,是给物理内存不够用时留一个兜底方案把一部分磁盘空间当作临时内存来用,Windows体系下叫页面文件(pagefile.sys),Linux体系下叫swap文件或交换分区。
机制本身不复杂:当物理内存被进程占满后,系统会按照一定算法把暂时不用的数据从内存挪到磁盘上,腾出空间给更急迫的任务,这个过程叫换出(swap out),等需要那些数据时再读回来,叫换入(swap in),磁盘比内存慢好几个数量级,所以一旦系统开始频繁换入换出,整体的响应速度就会肉眼可见地变慢。
触发虚拟内存不足的现场,通常有两种典型信号:
- 系统弹窗或日志直接报“虚拟内存不足”“系统虚拟内存太低”;
- 服务突然失联,进程被操作系统Kill掉,查日志只看到OOM(Out of Memory)字样。
这两个信号看起来不同,但背后的原因高度重合页面文件或swap被写满了,而物理内存也已经处于枯竭状态,也就是说,虚拟内存不足,往往是因为内存整体不够用导致的,不是单独调大页面文件就能一劳永逸的。
服务器内存不足怎么排查?先从这五个方向找原因
排查虚拟内存不足,本质上是在排查内存压力从哪里来,跳过过程直接改参数的后果是,问题短期内被掩盖,过几天又出现,而且通常一次比一次严重。
按经验,建议按下面的顺序把每个环节过一遍:
第一,看物理内存的实际占用情况。 Windows下打开任务管理器,Linux下用free -h或top查看,重点看的不是总占用率,而是可用内存(available)还剩下多少,如果长期低于总内存的10%,说明内存容量已经承载不了现有业务的压力了。
第二,找出内存占用最高的进程。 Windows下按内存排序,Linux下用ps aux --sort=-%mem | head -20,很多情况下你会发现,问题就集中在某一个进程上,比如Java应用、MySQL数据库或者某个第三方服务。
第三,检查内存泄漏的可能。 一个进程启动时占用2GB,运行一周后涨到6GB并持续攀升,这是典型的泄漏特征,多数情况下,反复重启服务只能缓解症状,治本要回到代码层面或者调优应用自身的缓存参数。
第四,确认页面文件或swap的现有设置。

Windows下右键“此电脑”进入“高级系统设置”,在“性能”里可以查到当前分页文件大小;Linux下用cat /proc/swaps查看swap使用量,有时不是物理内存不够,而是交换空间本身设得太小,或者被设置成了固定值且远低于推荐大小。
第五,看磁盘的剩余空间和I/O负载。 虚拟内存需要磁盘做承载,如果系统盘剩余空间非常少,页面文件无法扩展,也会间接触发虚拟内存不足,此时用df -h看磁盘占用,同时用iostat或vmstat观察I/O等待,侧面验证系统是否在疯狂交换数据。
虚拟内存不足怎么解决?应急操作分两步走
当故障已经发生,线上服务正在受到影响时,优先做这两件事:扩容交换空间,释放被占用的内存。
第一步:Windows下快速扩大页面文件
Windows系统中,页面文件默认受“自动管理所有驱动器的分页文件大小”控制,遇到虚拟内存不足时可以按以下路径手动调整:
- 右键“此电脑” → “属性” → “高级系统设置”;
- 点击“高级”选项卡中“性能”区域的“设置”按钮;
- 切换到“高级”页面,点击“更改”打开虚拟内存配置窗口;
- 取消勾选“自动管理所有驱动器的分页文件大小”;
- 选中系统所在的分区,点击“自定义大小”,在“初始大小”和“最大值”中分别录入目标数值。
一个实用的参考是:把页面文件的初始大小设为物理内存的1.5倍,最大值设为2倍,如果物理内存已经有32GB以上,这个倍数可以适当降低,因为过大的页面文件不仅浪费磁盘空间,还会在频繁读写时拖累整个系统。
第二步:Linux下快速扩容swap空间
Linux服务器多数情况下不会像Windows那样弹窗,而是直接让进程被OOM Killer终止,紧急扩容swap有两种做法,推荐用swap文件,因为不需要重新分区:
# 创建一个4GB的swap文件(大小按需调整) dd if=/dev/zero of=/swapfile bs=1M count=4096 # 设置安全权限,防止其他用户读取 chmod 600 /swapfile # 格式化为swap文件系统 mkswap /swapfile # 立即启用 swapon /swapfile
命令会让swap在本次运行期间生效,为了让服务器重启后依然能自动挂载,需要额外向/etc/fstab文件追加一行:
/swapfile none swap sw 0 0
追加完成后用free -h确认swap总量已经变化。
第三步:给系统“紧急减负”
扩容交换空间只是给系统争取了喘息时间,紧随其后要做的是把最耗内存的进程处理掉,可以先通过top按M键按内存占用排序,找到排名靠前的进程,然后根据业务性质判断是否能重启或减少其并发数,临时降低数据库的缓存池大小、暂时停掉不重要的定时任务,也能释放一部分内存。
虚拟内存设置多少合适?优化重点不在大小而在策略

应急手段用完之后,回过头来谈优化,很多运维同行习惯把虚拟内存调得很大来避免报错,但行业共识认为,这类做法属于治标不治本,虚拟内存的量级设置应当取决于物理内存容量和应用类型。
下面是按服务器规模划分的参考策略:
- 内存小于4GB的中小型服务器: swap或页面文件建议设为物理内存的2倍,因为这类机器往往运行着较密集的业务,交换需求大;
- 内存4GB到16GB的通用服务器: swap设为物理内存的1倍或1.5倍即可,配合合理的应用参数,基本能覆盖峰值压力;
- 内存超过32GB的数据库、计算型服务器: swap不建议超过16GB,优先考虑关闭交换或设置为较小值,把性能留给物理内存。
一个容易被人忽略的事实是,虚拟内存的容量不是决定因素,交换策略才是,以Linux为例,内核参数vm.swappiness控制着系统使用swap的倾向度,取值范围是0到100,默认值是60,但对于追求稳定响应的数据库服务器,业内专家指出,把vm.swappiness调低到10以下,让系统优先使用物理内存,能显著降低因误交换引发的性能抖动。
调整方法如下:
# 临时修改,重启后失效 sysctl vm.swappiness=10 # 永久生效,写入配置文件 echo "vm.swappiness=10" >> /etc/sysctl.conf sysctl -p
Windows虽然没有完全对标的参数,但可以通过降低开机启动项数量、关闭无用的视觉效果来减轻内存压力。
虚拟内存不足,本质上还是物理内存与业务负载的博弈
为了便于理解,把不同状态下的表现放在一起对比:
| 服务器状态 | 系统表现 | 数据交换情况 |
|---|---|---|
| 物理内存充足 | 响应流畅,磁盘I/O平稳 | 进程请求的内存都能被满足,几乎不触发换页 |
| 物理内存紧张但虚拟内存够大 | 响应变慢,磁盘读写频繁 | 系统持续把内存数据换到磁盘,I/O成为瓶颈 |
| 物理内存和虚拟内存双双耗尽 | 服务中断,进程被杀 | 系统已无法分配任何可用内存,触发OOM机制 |
这个表直观地说明了一件事:虚拟内存不足不是孤立事件,它往往意味着服务器整体的内存规划已经到了临界点。
解决这个问题最彻底的方式,仍然是增加物理内存容量,扩容后,合理减少swap的依赖,把交换空间降到一个保底水平,服务器的稳定性才会有真正的提升,虚拟内存承担的角色,应该是一个“安全气囊”而不是“日常燃料”。
监控与预防:在虚拟内存不足到来之前看到苗头
等到报错出现在屏幕上,其实损失已经发生了,预防的关键在于把内存指标纳入日常监控体系。
Linux服务器推荐使用的监控组合:
Prometheus + node_exporter + Grafana
:抓取内存、swap、I/O指标并可视化;
sar -r:查看历史内存占用记录,判断是否存在持续上升的趋势;sysstat工具包中的pidstat -r:按进程维度追踪内存增长,协助定位泄漏源。
Windows服务器可用的监控手段:
- 性能监视器:添加“Memory\Available Mbytes”和“Paging File\% Usage”计数器;
- 任务管理器的“性能”页签配合资源监视器,实时查看哪些进程在占用内存。
阈值设置方面,建议当物理内存使用率连续10分钟超过85%时触发告警,当swap使用率超过70%时进入重点关注状态,监控到位后,虚拟内存不足往往会以“内存紧张预警”的形式提前出现,远远早于真正崩溃的那一刻。
虚拟内存不足还会引发哪些连锁反应?
有相当一部分管理员是在系统卡顿到无法操作时才注意到虚拟内存不足的,在此之前系统已经表现出了一些容易被忽略的前兆:
- 应用响应时间变长,数据库查询变得特别慢;
- 日志中出现大量“OutOfMemoryError”或“Killed process”记录;
- 磁盘I/O等待时间大幅上升,
top中的wa指标持续保持在高位; - 远程SSH登录慢或超时,Web页面加载异常缓慢。
这些现象的共同根源只有一个:内存资源已经支撑不住业务的峰值需求,把虚拟内存调大,承担的是“临时缓冲”的角色,如果业务体量仍处于增长趋势,加物理内存、优化应用内存使用,才是唯一的出路。
关于虚拟内存不足的三个高频疑问
云服务器虚拟内存不足时,可以不重启就解决吗?
可以,Linux的swap文件创建和启用支持在线操作,执行mkswap和swapon之后,不需要重启服务器即可生效,Windows的页面文件修改后需要重启才能完全生效,但部分配置在重启前已经开始起效,如果线上业务不允许重启,可以先通过挂载swap文件(Linux)或临时增加交换文件的方式缓解。
如何判断虚拟内存不足是否由内存泄漏引起?
通过对比进程运行时长和内存占用量的关系来判断,连续一周每天记录同一进程的内存占用,如果数值持续走高且不回落,泄漏的可能性较大,配合jstat(Java应用)或memory profiler工具可以进一步定位具体对象,内存泄漏通常不会自行恢复,唯一可用的应急手段是定期重启服务,根治则需要解决代码或配置层面的问题。
增加物理内存后,虚拟内存的配置需要同步调整吗?
建议同步调整,物理内存扩容后,系统对虚拟内存的依赖程度会明显降低,如果swap仍保持原来的大容量配置,不仅浪费存储空间,还可能因换页遍历范围过大而产生额外开销,合理做法是把swap回收到一个较低的水平,Windows的页面文件也相应缩小初始值和最大值,保留一个“保命额度”即可。