我知道工作集是进程正在使用的实际内存量,并且私有字节是为了以防需要更多内存而预留的量。
那么我是否应该将这两者相加来计算出系统中其他进程实际占用了多少内存?
答案1
恐怕事情没那么简单。特别是 Private bytes 对于回答你提出的问题来说不是很有用。
首先要记住的是,内存页面可能存在于主内存中,也可能存在于外部存储器中(现在称为“磁盘分页”或“交换”)。其次,进程将在其占用空间中拥有私有内存页面,但也会使用其他进程同时使用的共享页面中的对象。
工作集是属于进程的页面的大小,这些页面当前存储在主内存中。当进程使用的内存页面被移动到页面文件时,它会从工作集度量中删除,当它被调回主内存时,它会再次被添加进去。
但是,工作集并不专门指您的进程所拥有的内存。进程使用许多共享内存对象,这些对象的大小反映在统计信息中。不幸的是,当两个进程共享一个 1MB 对象时,它们的两个进程都会在工作集中显示 1MB 的分配,因此,如果将所有工作集加起来,1MB 对象将被记录两次,因此在极端情况下,所有工作集大小的累积可能会超过可用 RAM 的大小。在此处查看更多信息:http://cybernetnews.com/cybernotes-windows-memory-usage-explained/
私人字节指在进程的私有内存占用空间完全被调出到交换区的情况下分配给进程的页面文件空间量(不一定使用)。大多数情况下,进程并不完全(或根本不)驻留在页面文件中,因此私有字节似乎有“空间”可供进一步分配。然而事实并非如此。
然而,私有字节仅指进程的私有内存,因此该值可能无法反映共享资源(即使共享资源当前仅由该进程使用)。
“工作集私有”(根据版本,进程资源管理器中为“WS 私有字节”或“私有 WS”)可能是最适合您使用的指标。它本身与页面文件无关,因此您可以准确了解进程对物理 RAM 的影响,并且它不会重复计算共享对象。共享对象只统计一次(仅针对创建它们的进程),但这也意味着从单进程的角度来看,您没有记录您的进程使用由另一个进程创建的共享对象,因此您的进程可能会在另一台计算机上使用更多 RAM,或者在需要创建共享对象本身而不是使用它的另一个进程实例的情况下使用更多 RAM。Windows 任务管理器使用工作集私有作为其内存使用量指标。
希望有帮助
答案2
切线答案就在这里。
如果您不必使用 Process Explorer,最快的方法是在 PowerShellCore 中运行此代码片段:
Get-Process -Name $processName | Select-Object PM,WS | Format-Table @{Label='PM (MB)';Expression={$_.PM / 1MB}},@{Label='WS (MB)';Expression={$_.WS / 1MB}}