虚拟内存
假设您的程序(例如 Oracle)在启动时分配了 100 MB 的内存 - 尽管没有触及额外的物理/磁盘页面,但您的 VM 大小增加了 100 MB。即 VM 只不过是内存簿记。
总可用物理内存+分页文件内存是系统中所有进程可以分配的最大内存。系统这样做是为了确保在任何时候如果进程实际开始消耗它分配的所有内存,操作系统可以提供所需的实际物理页面。
私人内存
如果程序将 10 MB 的数据复制到这 100 MB 中,操作系统会感知到没有为与这些地址对应的进程分配任何页面,并将价值 10 MB 的物理页面分配到进程的私有内存中。(这个过程称为缺页)
工作集
定义:工作集是程序最近接触过的内存页的集合。
此时这 10 个页面被添加到流程的工作集中。如果该进程接着将该数据复制到先前分配的另一个 10 MB 缓存中,则其他一切都保持不变,但如果那些旧页面不在工作集中,则工作集会再次增加 10 Mb。但是如果那些页面已经在工作集中,那么一切都很好,程序工作集中保持不变。
工作集行为
想象一下,您的进程再也不会触及前 10 个页面,在这种情况下,这些页面会从您的进程的工作集中删除,并可能发送到页面文件,以便操作系统可以引入其他更频繁使用的页面。但是,如果没有紧急的低内存需求,则无需执行此分页操作,操作系统可以像其丰富的内存一样行事。在这种情况下,工作集只是让这些页面保留下来。
什么时候工作集 > 虚拟内存
现在想象同一个程序取消分配所有 100 Mb 的内存。程序 VM 大小立即减少 100 MB(记住 VM = 所有内存分配请求的簿记)
工作集不必受此影响,因为这不会改变最近触及的那些 10 Mb 页面的事实。因此,尽管操作系统可以在需要时回收它们,但这些页面仍然保留在进程的工作集中。
这将有效地使 VM < 工作集。但是,如果您启动另一个消耗更多内存的进程并且操作系统回收工作集页面,这将纠正。