windows备用内存(任务管理器-性能-已缓存)占用过大 解决方案

目录

问题内容

问题描述

已缓存是什么


问题内容

问题描述

通常windows的下图“已缓存”部分,会占用到一小半的全部内存大小(下图是我处理完这个问题后的截图,之前“已缓存”常常占到14-15GB左右(流汗黄豆),内存“使用中”从来上不到18GB以上,到了这个线就开始疯狂卡顿)。实践使用发现,“已缓存”空间大小和“可用”空间大小接近时,系统会产生明显卡顿。

即,你所看到的“可用”的内存空间,通常不会表现出完全的自由、可用、余量充足的性质。

“已缓存”是什么

参考文章:https://superuser.com/questions/1410289/what-are-commited-memory-cached-paged-not-paged-pool-how-they-are-d

英文中,“已缓存”对应原文是Cached

上述参考链接的文章中,最长的一条回复中说,Cached由以下三部分构成

Cached part 1: the Standby Page List (including SuperFetch)

Cached part 2: the Modified Page List

Cached part 3: the File System Cache

这篇19年的文章中描述这部分内容的段落,由ai总结如下

概括来说,包括几个部分

  1. 从工作集中移除的内存页面
  2. SuperFetch预读所占用的内存
  3. 从工作集中移除的、修改了的页面
  4. 文件系统缓存

总结: 任务管理器性能选项卡中的 “Cached(缓存)” 计数器是以下三种内存使用情况的总和(是内存计数,非虚拟内存):

Cached 部分 1:备用页面列表(包括 SuperFetch)
  • 在 “资源监视器” 的 “内存” 选项卡可见。在 Windows Vista 之前,它专门用作 “页面缓存”,从工作集中移除的内存页面(之后访问它们会产生页面错误)首先会被放到备用页面列表。如果原进程在页面被重新分配前引用了备用页面列表中的页面,该页面可恢复到原工作集。自 Vista 及以后,备用页面列表中的一些页面可能被 SuperFetch 重新利用。
  • SuperFetch 是一种主动的只读文件缓存机制,会记录经常访问的文件历史,并在实际请求之前将这些文件读入内存以加快速度。SuperFetch 使用的页面不会从备用页面列表中移除,仍可被重新利用,且算作缓存和可用内存的一部分,在系统盘是 SSD 时,SuperFetch 默认禁用。备用页面列表属于报告为 “可用” 的内存部分,不算作 “正在使用” 内存,虽然 SuperFetch 在使用它,但解决软页面错误时也在使用它,微软对于 “正在使用” 这一术语有误导性。
Cached 部分 2:修改页面列表
  • 自 Windows 8 及以后,缓存计数器包括修改页面列表中的物理页面。修改页面列表的大小在资源监视器的内存选项卡可查看,通常很小或为零。
  • 它与备用页面列表类似,但用于存储在驻留期间内容被修改的页面(由 CPU 的 MMU 记录),从工作集中移除时,这些页面被移到修改页面列表而不是备用页面列表。“系统” 进程中的 “修改页面写入” 线程会定期唤醒,将页面内容复制到相应的后备存储(页面文件或文件支持页面的相应文件),然后将它们移到备用页面列表,此时它们成为可用部分。在修改页面列表中时,它们不算作可用内存,因为内容保存之前不能被重新用于其他用途,也不算作 “正在使用” 内存。如果禁用了页面文件,可能导致修改页面列表异常大,引起可用内存短缺和页面抖动。
Cached 部分 3:文件系统缓存
  • 在 Windows 10 的某个版本或早在 Windows 8 时,它不再是任务管理器缓存计数器的一部分,但仍然存在,相关的 PerfMon 计数器仍在且活跃。文件系统缓存的常驻大小曾仍包含在 “正在使用” 中(“常驻” 指的是在虚拟分配中位于内存且在工作集中的部分)。
  • 文件系统缓存是反应式缓存(非预测式,即使用后才缓存以便后续快速使用),在支持非扇区对齐边界的文件访问中有重要作用。在早期 Windows 版本中,文件缓存的常驻部分是系统工作集的一部分,在 Windows 7 及以后,系统工作集分为四个,文件缓存占其中之一,其常驻大小仍可通过特定 PerfMon 计数器反映,且常驻部分包含在 “正在使用” 中。

“已缓存”如何清理

虽然Superfetch说可以利用空闲内存来预读取一些代码和数据,增加系统反应时间。但是内存有十多个G的预读是否有些过分了(流汗黄豆),而“已缓存”的其他部分通常也占不到这么多空间。说到底,缓存叫这个名字,对它的清理本身就不影响系统正常运行,只是多了它能加快系统性能

因此当你受到内存占用问题困扰的时候,只能使用自己内存条一半的空间、另一半不知道被什么玩意霸占, 而困扰的时候,你可能愿意付出一点系统性能,而去解决这个问题。

另外,本人至今未找到有某个系统选项能够控制“已缓存”的占用上限。欢迎在评论区补充

“已缓存”数据如何监控

RAMMap

第一个工具是可以用RAMMap,微软官方提供的工具。下载后出来的窗口中,可以查看你当前的内存占用结构。

RAMMap - Sysinternals | Microsoft Learn

你可以点击图中这个按钮,清空 Standby(备用) List,就是清空备用内存。这个程序的这个功能就是我们后续用到来清理“已缓存”内存占用的方法

如果你正打开了任务管理器-性能,你会发现“已缓存”从几个GB掉回到了几百MB

这个软件的问题是,如果用它自带的刷新功能,它的延迟有十几秒,无法实时监控

参考文章:清理备用内存/关闭备用内存(备用内存占用过高且不自动释放)-CSDN博客

性能监视器

win键打开start menu,然后键入“性能监视器”,打开性能监视器这个程序

然后点开左栏“监视工具”下的“性能监视器”,然后在右栏上边第三个按钮“更改图形类型”,点两下,改成“报告”模式,展示具体数据

然后点开绿色“+”按钮,添加以下几项:

  • Memory - Modified Page List Bytes
  • Memory - Standby Cache Core Bytes
  • Memory - Cache Normal Priority Bytes
  • Memory - Cache Reservve Bytes
  • 注意,Memory - Cache Bytes 这一项与“已缓存”数据无关

在查看数据的时候注意细节,有些条目的最后一个符号是小数点‘.’,有些是逗号‘,’,不要看错了

你可以把这些实时数据,和任务管理器的“已缓存”数据对比,大概这四项架起来就约等于“已缓存”了

而且观察还发现,'Memory - Standby Cache Normal Priority Bytes' 占总数的大部分,且会持续增长,而其他几项通常有升有降,保持在一定范围内

“已缓存”如何自动化清理

如果你认真看完本篇文章以上部分,并配合了实践,你会发现,RAMMap的那个按钮,可以手动清理“已缓存”项

但是你不可能时刻手动清理,这很麻烦

参考文章:https://www.zhihu.com/question/263768043

这个链接里的最长的一条回复中,提到用windows的任务计划程序,以及RAMMap的命令调用,实现了一个定时执行'RAMMap -Et',即定时进行Standby List的清理

但是这个解决方案有些问题:任务计划程序中,最短的定时触发,是5min,但是5min也可能产生极大的“已缓存”空间占用。

个人使用下来:32g,开了一个模拟器、开了十几个页面的Chrome、开了potplayer,此时内存占用已经不小了,然后进行一次内存清理,省出了十几个G,准备再多开一个绝区零,但是在过程中,“已缓存”在清理后又迅速增长,然后快速和任务管理器-性能-“可用”这一项数据逼近,即空闲页越来越少,然后最后电脑黑屏闪烁,然后绝区零闪退报错,其他几个程序出现卡顿和窗口异常……因此,【定时清理】还是不够的,需要到了警戒线马上清理

方案简述:在“性能监视器”中建立一个性能计数器警报,在“任务计划程序”中建立一个用户任务,使得当统计到的“已缓存”数据中占比最大的那一项的数据超过临界值,就被性能监视器发现,然后调用执行这个用户任务,这个用户内容就是执行RAMMap的清理Standby List功能

性能监视器 设置

打开win键,输入性能监视器以打开它

左栏-数据收集器-用户定义-右键新建数据收集器

手动创建

性能计数器警报

选择Memory - Standby Cache Normal Priority Bytes

我设置为超过3GB就自行处理,3*1024*1024*1024 = 3,221,225,472

        不过似乎这里设置没有用……主要是下面的设置

然后保存并关闭

点击你刚刚创建的数据收集器,然后右栏出现一个DataCollector01,点开它的右键-属性

在这里选择警告内容

选择Memory - Standby Cache Normal Priority Bytes

然后限制这里,填上你想要的触发线标准。我用的是3,221,225,472,你也可以在做完整套后,多次测试再调整这个数值,以适合你的电脑

当然,你可以再增加其他数据的警戒线,比如Memory-Modified Page List Bytes

示例间隔,可以改为5秒,看你怎么需要。

在警告操作的选项卡中,选择要启动你刚刚建立的那个数据收集器

测试下来,由于数据收集器在警报后,就会从运行状态停止。因此数据收集器的警报器,在警报后,需要重新启动自身这个收集器,从而让它一直运行和警报,否则这个收集器就直接关闭了

在警报任务选项卡中,填入一个【任务名字】,这个任务名字,就是你再下面一节要创建的用户任务的名字,调用执行是通过任务名字来定位的

然后点击应用、确认

记得要点击左栏你的数据收集器,然后再上边找到启动按钮,启用它

任务计划程序 设置

win键-键入 任务计划程序,打开它

右栏点击 “创建任务”

关键点:

  1. “常规”选项卡:“名字”,一定要写你上面定的【任务名字】
  2. “常规”选项卡:勾选 使用最高权限运行。因为RAMMap需要系统权限
  3. (建议)“常规”选项卡:勾选 隐藏
  4. (建议)“常规”选项卡:修改“配置”为你的系统版本
  5. “触发器”选项卡:不需要新建。你当然也可以新建一个定时触发的触发器,看你需要
  6. “操作”选项卡:按照下图填写。RAMMap的路径你需要自行更改
  7. “条件”选项卡:取消勾选 只有在计算机使用交流电源时才启动此任务
  8. “历史记录”选项卡:可以在你完成了全套流程后,检查此任务的执行记录,debug用
  9. 具体操作截图可以看https://www.zhihu.com/question/263768043 这篇文章的截图很详细了

到此为止全部设置完毕了。

你现在应该可以看看任务管理器-性能上的实时数据,确保整个“已缓存”清理的链条成功执行

总结

  • 有人提到关闭“服务-sysmain”,以关闭Superfetch功能。个人使用下来,这个方法并不会让“已缓存”部分长期稳定在一个较小的值,并且体感上没有什么效果。
  • 当然,内存不够,根本上还是需要再增加内存条了,这个方法只是能帮你多挤一些牙膏而已,而且或许某些时候(比如多开负载严重的时候)会因此产生一些bug之类的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值