我目前正在编写一个应用程序的报告,我想知道它的内存使用情况。Windows 10 有一个很好的功能,可以压缩不在进程工作集中的内存,以便管理更多内存并避免交换,从而提高整体性能(我认为它也存在于 Linux 中)。
问题是,我不知道 Windows 10 的任务管理器是否报告每个应用程序的总内存使用情况,就好像它们未压缩一样,或者它显示未压缩的部分,而其余部分以压缩形式驻留在系统进程中(通过压缩许多应用程序,随着时间的推移,系统进程会变得非常繁重)。
答案1
详细的内存测量可以用Windows 性能工具包。在这里您可以跟踪 VAlloc 调用以查看工具中的内存分配。
还内存映射可用于捕获 Windows 内存使用情况的快照。
但是没有一个工具可以检测出有多少数据被压缩了。也许微软会在 Windows 10 Redstone 更新中添加此功能。
答案2
Windows 10 压缩的唯一内存是在“系统”进程中。您看到的其他进程的工作集计数器没有反映任何压缩,也没有发生任何压缩。因此,您可以像往常一样使用每个进程的工作集计数器。
进程工作集中的内存不能被压缩,因为进程工作集中的任何内容都可以引用而不会导致页面错误。因此内存管理器没有机会对其进行解压缩。进程中的普通代码将引用(或尝试执行!)压缩的内存内容,而这根本行不通。因此,进程工作集计数器的含义仍然与它们一贯的含义相同。
至于“系统”进程……压缩内存是已修改页面列表中的 RAM 页面的压缩版本。当 RAM 压力需要提供更多 RAM 时,页面将放在 MPL 上。这些页面的内容在进程工作集中被修改,因此在将它们用于其他用途之前,必须将其内容复制到“后备存储” - 对于进程私有页面,这通常是页面文件。
在以前的 Windows 版本中,这些内容会被写入页面文件,然后从 MPL 移至待机列表。从那里,它们可能会被故障送回丢失它们的进程,或者“重新利用”——用作“可用”RAM 以满足其他需求。Windows 10 的方法是压缩它们的内容,并将压缩的内容存储在“系统”进程的私有地址空间中。
与以前的版本相比,RAM 使用量没有增加。事实上,还减少了。过去,这些页面会以原始(未压缩)形式出现在待机列表中。在 Windows 10 下,它们以压缩形式存在于系统进程中。因此它们占用的空间更少。
缺点是“丢失”这些页面的进程无法简单地将页面故障恢复到其工作集(因为它们可以来自已修改或备用页面列表),因为它们的内容必须在使用前解压缩。解压缩在通常的软故障解决路径中处理。但是,解压缩所需的时间比以前版本中从页面文件(即使在 SSD 上)读取内容所需的时间要少得多。
在 RAM 不足时,可以通过将这些修改过的页面的内容写入页面文件,将其用于其他用途,就像在以前的版本中一样。但与以前的版本不同,在 Windows 10 中,当发生这种情况时,它们的内容已经压缩。因此它们花费的写入时间更少,在页面文件中占用的空间也更少。如果稍后必须从页面文件中读回它们,同样,它们花费的读取时间更少,因为压缩意味着要读取的数据更少。