跑程序调试的那段时间,频繁在代码控制台看到内存已提交的提示,一开始完全摸不着头脑,总以为是内存溢出、程序要崩的预警,白白慌了好多次,还乱改代码参数,越调越乱。
最开始碰到这个提示,是在本地跑批量数据处理脚本的时候。脚本一运行,任务管理器的内存栏就跳出内存已提交的状态,原本以为是占用了物理内存,立马手动关闭了很多后台软件,清空了所有缓存,结果这个状态一点变化都没有,程序依旧正常运行,没有卡顿也没有报错。
折腾好久才搞明白,这根本不是内存过载的报错提示,只是系统的一个常规状态反馈。很多人都会和我一样搞错,把内存已提交和物理内存占用混为一谈,物理内存是电脑实打实的运行内存,而提交内存是系统提前预留、分配给程序的虚拟内存空间,是系统提前报备、预留出来的可用内存额度。
真正踩坑的一次,是一次性批量处理上万条数据,内存已提交的数值持续飙升,当时误以为电脑内存撑不住,强行终止了运行中的脚本。结果所有未保存的处理数据全部丢失,白白浪费了大半天的工作量,重启程序重新跑的时候,才发现电脑的物理内存使用率其实还不到一半,完全可以正常运行。
系统会提前给正在运行的程序划定一块虚拟内存区间,哪怕程序当下没有用完所有预留空间,系统也会标记为内存已提交。简单说就是,程序向系统申请了内存资源,系统已经审批预留,数据已经暂存到内存中,等待后续写入磁盘完成落地,这个中间状态就是内存已提交。
很多时候看着提交内存数值很高,电脑却不卡顿、不闪退,核心原因就在这。提交内存不代表实时占用,只是系统锁定了额度,防止其他程序抢占资源,保障当前程序稳定运行。
之前一直傻傻以为,这个数值越高电脑越卡,为此删了很多后台进程,甚至调低了程序的运行配置,导致数据处理速度大幅变慢。后来反复测试才发现,真正影响电脑运行速度的,永远是物理内存的实时使用率,不是已经提交的内存额度。
只要物理内存使用率保持在合理区间,哪怕内存已提交的数值拉满,也完全不用干预、不用终止程序、不用清理后台。只有当物理内存和提交内存同时爆满,程序才会出现卡顿、闪退、运行失败的情况。
后续再写脚本、跑程序、开大型软件,再也不会被这个状态误导。看到内存已提交,只会默认是正常的资源预留状态,安心等待程序完成数据写入即可,再也不会做强行终止进程的无用操作。
那天调试完所有脚本,关掉电脑的时候,桌面还停留在任务管理器的内存监测页面,盯着稳定跳动的提交内存数值,突然就释然了,很多所谓的异常提示,不过是自己认知不够造成的无端焦虑。