13、【MOD开发】【骑砍2】运行内存:把经验扩展到其他应用

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

13、【MOD开发】【骑砍2】运行内存:把经验扩展到其他应用

背景

上篇 【MOD开发】【骑砍2】运行内存:游戏里的 pagefile 与虚拟内存 把游戏侧的机制讲清楚了:游戏访问虚拟地址,页表负责翻译,页错误把页从页面文件搬回 RAM(Random Access Memory,随机存取存储器);页面文件增加的是提交上限,不是物理内存;冷页换出可以腾出 RAM,热页密集切页会带来卡顿和加载变慢;战场加载是峰值场景,纹理、植被、Agent(游戏中的行动单位)、阵型和 MOD(Modification,模组)会在短时间内集中提交。

这些机制不只属于骑砍2。浏览器、IDE、虚拟机、剪辑软件、模拟器和大型 Office 文件都可能遇到同一类提交压力。本篇把骑砍2的案例抽象成通用判断:哪些程序适合用页面文件兜底,扩容会带来什么收益,又会付出什么代价。


骑砍2

🧩 哪些应用会受益

应用 典型压力 页面文件的作用 注意点
浏览器 多标签、多个渲染进程、缓存 承载冷标签和缓存,避免提交耗尽 标签泄漏仍需关闭或升级浏览器
IDE(Integrated Development Environment,集成开发环境)与编译器 索引、构建、语言服务 吸收构建峰值和冷缓存 构建结束后工作集回落,提交未必立刻下降
虚拟机 / WSL2(Windows Subsystem for Linux 2,Windows 的 Linux 子系统)/ Docker 客户机内存、镜像、容器 给宿主提交留余量 过度分配客户机内存会拖垮宿主
视频剪辑 / 3D(Three-Dimensional,三维)渲染 高分辨率素材、缓存、预览 避免素材加载阶段 OOM(Out of Memory,内存耗尽) 热素材仍要驻留 RAM,切页会拖慢预览
游戏模拟器 纹理、着色器、ROM(Read-Only Memory,只读存储器)缓存 和游戏类似,给场景切换兜底 模拟器自身的缓存策略也会影响峰值
大型 Office 文件 多文档、撤销历史、嵌入对象 吸收打开和编辑峰值 文件损坏或插件泄漏仍需单独处理
科学计算 大数组、中间结果 让超过 RAM 的数据集有机会运行 工作集长期超过 RAM 时性能会明显下降
数据库 / 实时服务 缓冲池、连接、查询 不是首选手段 通常应先调缓冲池、连接数和查询,再评估页面文件

页面文件最适合"有明显峰值、冷热分层清楚、允许短时延迟"的负载。对延迟极敏感的实时服务,或者工作集长期大于 RAM 的负载,优先加内存或降低并发,而不是继续扩大页面文件。


🧩 三个具体例子

浏览器开 30 个标签时,冷标签和缓存可以被换出,页面文件能避免提交耗尽;但如果某个渲染进程持续泄漏,扩容只能延后崩溃时间,仍需关闭标签或升级浏览器。

IDE 建立索引和编译时会出现短时峰值,页面文件可以吸收这部分提交;索引完成后工作集回落,提交量未必立刻下降,判断是否够用要看峰值余量。

虚拟机同时运行多个客户机时,宿主提交量会叠加;页面文件可以提供余量,但客户机内存总和长期超过宿主 RAM 时,切页会把整机拖慢,优先调整客户机内存分配。


📊 收益与限制

维度 结果 用途
稳定性 提交上限提高,分配失败减少 避免 OOM 和进程直接退出
并发能力 可以同时保留更多冷页 多开程序、多标签、多任务更从容
峰值承载 吸收构建、加载、渲染的短时峰值 峰值过后系统可以回收
磁盘空间 页面文件占用磁盘,D 盘 32GB 会直接减少可用空间 需要预留 10--15% 空闲
SSD(Solid State Drive,固态硬盘)写入 切页会增加写入量 现代 SSD 有寿命余量,但长期高频切页不是好状态
延迟 热页被换出后重新读入需要 I/O 机械硬盘上会表现为明显卡顿
安全 页面文件可能包含内存中的敏感数据 有敏感数据时依赖磁盘加密和访问控制
备份 页面文件通常不需要备份 备份工具一般会跳过系统文件
内核转储 系统盘页面文件影响内核转储 移动或关闭系统盘页面文件前要确认转储需求

磁盘空间是最容易被忽略的代价。本次把 C 盘页面文件设为 8GB、D 盘设为 32GB,合计 40GB;D 盘可用空间会相应减少。页面文件是隐藏的系统文件,资源管理器默认不显示,但磁盘容量的确被占用了。磁盘写满后,页面文件无法扩展,新的提交请求仍可能失败。

页面文件可能包含内存中的敏感数据;有合规要求时依赖 BitLocker 等磁盘加密,并评估关机清理策略。页面文件通常不需要备份,备份工具会跳过系统文件;真正需要保护的是业务数据和配置。


🧮 怎么定大小

页面文件大小不应该套一个固定倍数,而应该看提交峰值。可以先在目标程序运行时采样:

powershell 复制代码
(Get-Counter '\Memory\Commit Limit').CounterSamples.CookedValue / 1GB
(Get-Counter '\Memory\Committed Bytes').CounterSamples.CookedValue / 1GB
(Get-Counter '\Memory\Available MBytes').CounterSamples.CookedValue

Commit Limit 是上限,Committed Bytes 是当前已提交量,两者相减是余量。建议在峰值场景下保留至少 4GB 余量;如果余量长期低于 1GB,下一次大分配就可能失败。

一个实用的参考区间如下,具体仍以峰值和磁盘空间为准:

物理内存 页面文件参考值 说明
8GB 8--16GB 低内存机器需要更多后备,但性能仍受 RAM 限制
16GB 16--32GB 本次案例取 8GB + 32GB,重点是抬高提交上限
32GB 16--32GB 或系统管理 常规办公和开发通常够用
64GB 及以上 系统管理或较小固定值 优先看峰值和转储需求,不必盲目放大

系统管理的页面文件在多数桌面场景下够用;只有当提交峰值持续接近上限,或者需要固定大小避免系统频繁调整时,才值得手动配置。手动配置的代价是要自己负责磁盘空间、重启验证和回滚。

图 1 加内存与加页面文件的取舍


🧪 监控与验收

在目标程序运行时采样 Commit Limit、Committed Bytes 和 Available MBytes,并记录峰值场景的余量。验收标准可以写成三条:峰值余量不低于 4GB;Event 2004 不再出现;磁盘剩余空间保持在 10--15%。

Get-Process | Sort-Object PagedMemorySize64 可以找出提交量最大的进程;Get-WinEvent 过滤 2004 可以确认系统是否再次触发低内存诊断。两者结合,比只看任务管理器更可靠。


⚠️ 常见坑

  • 把页面文件放在机械硬盘上,密集切页会把卡顿放大。
  • 磁盘剩余空间不足,页面文件无法扩展到目标大小。
  • 移动或关闭系统盘页面文件,可能导致内核转储无法生成;需要转储时保留系统盘页面文件或配置专用转储文件。
  • AutomaticManagedPagefile=True 时 Win32_PageFileSetting 可能为空,不能据此判断"没有页面文件"。
  • 只看配置对象,不看 Win32_PageFileUsage.AllocatedBaseSize,会误以为配置已经生效。
  • 回滚后残留 D:\pagefile.sys,需要在重启后确认并手动清理。
  • 页面文件可能包含敏感内存数据;有合规要求时依赖 BitLocker 等磁盘加密,必要时评估关机清理策略。
  • 把页面文件当成性能加速器;它主要换稳定性,热页切回仍然要付出 I/O 成本。
  • 在系统运行时删除 pagefile.sys,文件被占用,删除会失败或导致异常。

本次的三个脚本可以复用到其他机器:apply 改目标盘符和大小,check 在重启后验证配置、实际分配和提交余量,restore 恢复自动管理。复用时要先确认磁盘空间、内核转储需求和目标程序的峰值,不要直接照搬 8GB + 32GB。


📌 小结

  • 页面文件适合有明显峰值、冷热分层清楚的负载,不是所有程序的通用加速手段。
  • 扩容提高的是提交上限,代价是磁盘空间、SSD 写入和切页延迟。
  • 用 Commit Limit、Committed Bytes 和峰值场景的余量定大小,不套固定倍数。
  • 系统管理通常够用;手动配置要有验证和回滚路径。
  • 磁盘写满、机械硬盘、内核转储和敏感数据是四个需要提前确认的边界。
  • 页面文件是稳定性保险,不是性能加速器;长期高负载优先加内存。

到这里,从 OOM 现场、术语、三个脚本、脚本语法到游戏机制和通用扩展,这条运行内存的排查与修复路径就完整了。


OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog

相关推荐
HIT_Weston10 小时前
12、【MOD开发】【骑砍2】运行内存:游戏里的 pagefile 与虚拟内存
mod开发·骑砍2
HIT_Weston2 天前
8、【MOD开发】【骑砍2】跨平台MOD构建环境(八)/:游戏根 bin 与模块 bin——运行程序集的两种归属
mod开发·骑砍2
HIT_Weston14 天前
5、【游戏MOD】【骑砍2】跨平台MOD构建环境(五)/:元数据查看工具与跨版本适配
mod开发·骑砍2
HIT_Weston14 天前
4、【游戏MOD】【骑砍2】跨平台MOD构建环境(四)/:跨平台编译与通用打包
mod开发·骑砍2
HIT_Weston15 天前
3、【MOD开发】【骑砍2】跨平台MOD构建环境(三):只读源码同步、子模块与路径大小写
mod开发·骑砍2
HIT_Weston16 天前
1、【MOD开发】【骑砍2】跨平台MOD构建环境(一):总体思路与 SDK 引导
mod开发·骑砍2
霸王•吕布3 年前
骑砍战团MOD开发(39)-RTS塔防保卫卡拉迪亚大陆
游戏开发·骑马与砍杀·骑砍战团·mod开发·rts塔防·rts视角·rts游戏