Windows 10 内存不足

Windows 10 内存不足

我有一台 Windows 10,已完全更新,配备 16GB RAM 的 PC。

昨天我决定清理我的回收站;我有一个备份程序,可以对文件进行版本控制,所以回收站里堆满了每天都会更改的小文件副本。最后,删除了大约 35,000 个文件。

首先,资源管理器窗口的行为确实很迟缓(例如,需要整整一分钟的时间来重新排序文件列表),而且因为我想检查我没有永久删除一些我关心的文件,所以我按组删除了大约 5,000 个文件。

删除三组后,操作系统显示“内存不足”消息;这不是通常的“请关闭某些程序”消息,而是在这种情况下,该消息表示操作系统将开始自行关闭程序。而且,它确实“关闭”了 Chrome(它实际上杀死了它,因为当我稍后重新启动它时,所有历史记录都丢失了)。我使用任务管理器检查了一下,发现 Explorer 确实占用了 16GB RAM 中的 15.9GB。除了 Chrome,过了一会儿,屏幕变黑了,以较低的分辨率短暂恢复,然后以正常分辨率恢复,但无法识别第二台显示器(即视频驱动程序崩溃了)。

重新启动系统后,一切都恢复正常(除了 Chrome 中的所有标签和历史记录都丢失了),但我对操作系统在这一切中的行为感到好奇。

问题:

  • Explorer 耗尽 16GB 的 RAM 来处理回收站中的 35,000 个文件真的有意义吗?我的文件夹中确实有那么多文件,而且它们不会造成任何麻烦。

  • 操作系统是否应该有一种机制来拒绝向程序提供 RAM(即使它是一个 Explorer 文件夹,我已将其设置为在单独的进程上启动)而不是让它崩溃系统?

答案1

Explorer 耗尽 16GB 的 RAM 来处理回收站中的 35,000 个文件真的有意义吗?我的文件夹中确实有那么多文件,而且它们不会造成任何麻烦。

回收站有所不同,因为它维护了额外的数据,这些数据需要在自定义视图中进行解析和呈现:

一个名为 info2(Windows 95 中未安装 Windows 桌面更新时为 info)的隐藏文件以二进制格式存储了文件的原始路径和原始名称。[7] 自 Windows Vista 起,每个文件的“元”信息都保存为 $I.,而原始文件则重命名为 $R.。

https://en.wikipedia.org/wiki/Trash_(computing)#Microsoft_Windows

当文件被发送到 Vista 回收站时,它会被重命名为一个伪随机文件名,以 $R 开头,以文件的原始扩展名结尾;这个 $R 文件包含文件的原始内容。除了 $R 文件外,还会创建另一个文件(以 $I 开头,与 $R 文件同名),其中包含文件的删除日期和时间(文件偏移量 16;8 字节)以及删除时的文件路径(文件偏移量 24;可变长度;Unicode 格式),如图 5.41 所示。

https://www.sciencedirect.com/topics/computer-science/recycle-bin

打开包含约 30,000 个文件的回收站目前也会消耗约 5.5 GB 的 Windows 资源管理器 RAM。虽然没有您的情况那么多,但我的文件较少,而且可能取决于文件被删除的位置,影响显示的路径长度,消耗不同的内存等。

因此,我认为回收站存在如此多文件的情况下消耗如此多的内存是正常的。

操作系统是否应该有一种机制来拒绝向程序提供 RAM(即使它是一个 Explorer 文件夹,我已将其设置为在单独的进程上启动)而不是让它崩溃系统?

很难判断 1. 消耗如此多内存的进程是否为用户做了正确的事情,以及 2. 该进程将来会如何表现。请记住,Windows 资源管理器不会在它变得不稳定之前开始告诉 Windows 消耗所有可用内存,而是随着时间的推移要求越来越多的内存,直到 Windows 认识到它有问题现在。此时它会通知您作为用户并询问要做什么,因为您是唯一可以决定的人。

当然,有不同的策略,Linux 的 OOM-killer 就是其中之一。它只是一个软件,在与 Windows 完全相同的情况下启动,但不是询问某个用户,默认情况下杀手自己决定。有时,在你的情况下最有可能,这意味着消耗所有内存的进程将被终止,可以选择以这种方式拯救系统。但情况不一定如此:想想你正在运行消耗大量内存的虚拟机或数据库的情况,一些新进程开始消耗更多内存,但比前面提到的要少,直到系统再次耗尽资源。根据当前的杀手设置/实施/... 可能只是你的一个大型虚拟机或数据库进程被终止,而不是新进程,因为杀手不知道哪个进程对你最有用。它只看到哪些进程消耗了大量内存,并且知道需要内存。

此外,请记住,保持操作系统的功能状态也只是问题的一个方面:操作系统最终是服务于您的奴隶,而您是它的主人,它会尽最大努力处理您交给它的工作负载。直到它无法再处理为止,这仅仅是因为通过执行您告诉它这样做的进程。

相关内容