Windows - 提交大小与虚拟大小
Posted
技术标签:
【中文标题】Windows - 提交大小与虚拟大小【英文标题】:Windows - Commit Size vs Virtual Size 【发布时间】:2014-04-06 03:03:09 【问题描述】:我想知道 Commit Size(在 Task Manager 中可见)和 Virtual Size(在 SysInternals 中可见)之间的确切区别进程浏览器)。
Process Explorer 中的 Virtual Size 参数看起来像是一个进程总虚拟内存使用量的更准确指标。然而 Commit Size 总是小于 Virtual Size 并且我猜它不包括进程使用的所有虚拟内存。我希望有人解释一下这些参数中究竟包含什么。
【问题讨论】:
【参考方案1】:虚拟大小是进程的虚拟地址空间的大小。
在分配内存时,您可以请求一个地址范围,而无需实际提交其后面的内存。在使用第二次分配调用提交它们之前,这些地址不会指向物理内存。
阅读更多关于VirtualAlloc。 Linux 有做同样事情的 mmap 函数。
【讨论】:
【参考方案2】:内存可以保留、提交、首次访问以及成为工作集的一部分。当内存被保留时,一部分地址空间被留出,没有其他事情发生。
当内存提交时,操作系统保证相应的页面可以原则上存在于物理RAM中或页面文件中。换句话说,它计入系统上可用页面总数的硬限制,并且它正式创建页面。也就是说,它创建页面并假装它们存在(实际上它们还不存在)。
当第一次访问内存时,正式存在的页面被创建,因此它们真正存在。要么向进程提供零页,要么从映射中将数据读入页中。页面被移动到进程的工作集中(但不一定永远保留在那里)。
每个正在运行的进程在 RAM 中都有许多 事实上和逻辑上的页面,即这些页面存在,并且它们也“正式”存在。这是进程的工作集。 此外,每个正在运行的进程都有实际上在 RAM 中的页面,但不再正式存在于 RAM 中。它们可能位于所谓的“备用列表”或缓冲区缓存的一部分,或其他不同的地方。当这些被访问时,操作系统可能会简单地将它们再次移动到工作集中。 最后,每个进程都有根本不在 RAM 中的页面(在交换中或它们尚不存在)。
虚拟大小包含进程保留的所有页面的大小。
提交大小仅包含已提交的页面。
也就是说,用外行的话来说,“虚拟大小”几乎是您自己的问题,并且仅受地址空间大小的限制,而“提交大小”是每个人的问题,因为它消耗全局有限资源(RAM 加上交换)。因此它会影响其他进程。
【讨论】:
很难说。两者都可能是内存泄漏或此类指标,但它们是不同的东西。当您的虚拟大小达到 2GB(或更早,由于碎片,或稍后使用 /3G)时,您最终将耗尽地址空间,因此尽管原则上可能有足够的 RAM,但进一步的分配将出现“内存不足”错误可用的。一般来说,“不断上升,再也不会下降”是不好的,但如果 commit 再次下降,这可能只是堆管理器保持内存保留(但适当地未提交),这将是好的。您是否遇到过实际的内存不足情况? 碎片问题是分配器很难(不可能)提供内存,即使有足够的内存。例如,std::vector
用于增长的典型模式是分配器的噩梦:分配一个更大的块,复制,然后释放较小的块。然后分配另一个更大的块,复制并释放第二个块。不可能以有用的方式回收释放的内存,因为块大小永远不会适合您要求的大小(幸运的是,这是一个罕见的事件,因为 vector
呈几何增长,但您可能会使用类似的分配模式)。
因此,如果您在这些情况下遇到崩溃,而实际上应该有足够的内存,那么是的,您很可能遇到了碎片。尝试注意分配/释放的模式,提前保留而不是动态增长,如果适用,分配更大的对象池(一次又一次重用的池对象可以创造奇迹)。还要注意分配器有最小的大小来处理(通常是 16 个字节,因为它对齐到 8 个字节并且需要存储簿记信息),所以分配许多非常小的对象是分配器的毒,也是。
不要将Commit Size
(由任务管理器报告)与Committed Pages
混淆。 Commit Size
是不受内存映射文件(例如二进制代码页)支持的内存量。 Committed Pages
是一段虚拟内存,包括所有可寻址的页面(相对于空闲或保留页面)。
[...] 正如您所指出的,完全与位置无关的代码是通常不计入提交的映射示例之一(但其他部分可能)。此外,您是对的,TaskManager 中显示的数字确实与页数相差一个等于页面大小的因子(但这只是一个演示细节)。尽管如此,这个内存肯定是在完整的页面中提交的,而且是同一个数字,只是那个特定工具中显示的数字更大。除了完整的页面之外,根本不可能提交任何内容(这也不是 100% 正确,因为分配粒度是 64k)。【参考方案3】:
提交大小是在页面文件中为进程保留的空间量。当它的页面需要被换出以在 RAM 中为其他进程腾出空间时使用。
是的,虚拟内存大小会更大,因为它包含了页面文件不支持的页面。至少是 EXE 和非重定位 DLL 中的代码和资源部分。必要时,可以简单地丢弃这些页面并从文件中重新加载。所有操作系统 DLL 都属于这一类。此外,进程使用的任何内存映射文件。 SysInternals 的 VMMap 实用程序可以提供洞察力。
【讨论】:
以上是关于Windows - 提交大小与虚拟大小的主要内容,如果未能解决你的问题,请参考以下文章