有没有办法判断在 Mac OSX (10.2+) 上运行的某个应用程序是否已将部分内存交换出去(即交换到某个文件/private/var/vm/swapfile*
)?交换了多少?
赏金(150 rps)
问题很简单。如果我在悬赏期结束前不到 2 天看到第一个正确答案,我会接受它。如果我到那时还没有答案,我会奖励告诉我最有趣的新事实的人。如果我没有从任何答案中学到任何东西,我会将悬赏奖励给写得最漂亮的人。
答案1
我已经在谷歌上搜索了很多次;-) 据我所知,给定进程的虚拟内存被分为页面它们由操作系统处理,并像 RAM 一样呈现给应用程序。
在基于 Mach 内核的 OS X 中,这由名为dynamic_pager
。此过程会生成您提到的交换文件/private/var/vm
。这些交换文件不是基于每个应用程序生成的,而是基于“需要内存”生成的。交换文件分为 4096 字节的页面,并且页面然后分配给需要虚拟内存的进程(操作系统认为需要)。因此,您无法将交换文件与给定应用程序关联,但您可以查看给定进程正在使用多少页面。
您可能想在终端中尝试该命令vm_stat
。这将为您提供虚拟机使用情况的统计数据(请注意,“页面大小”乘以活动页面数等于交换文件的大小)。这也解释了为什么您可以让多个进程使用虚拟机,但只能使用几个交换文件。
其他有趣的命令是vmmap [process id]
和pagestuff
。
答案2
根据这里发布的想法,我创建了这一小行代码:
sudo vmmap notifyd | grep -A3 'Summary'
它显示 vmmap 输出的摘要部分(3 行)。我notifyd
在本例中使用了它,但您可以用您知道的任何 PID 替换它。
此行将尝试列出所有正在运行的进程的所有摘要行。显然有些会失败,因为它们的进程 ID 已经消失(进程已结束),但总的来说,我发现这是一种滚动查看内存信息列表并找出顶部交换器的好方法。
ps -o pid= -xa | awk '{print $1}' | xargs -n 1 sudo vmmap | grep -A3 'Summary'
已编辑:一些匿名用户看到这最后一个命令行需要改进,因为显然原始变体不再起作用。所以非常感谢你,无论你是谁,我很抱歉你的编辑被拒绝了。(第一个命令之前读取“ps xa”,并导致 vmmap 失败,因为 ps 的标题被抛出)
进一步改进:如果您想立即知道程序的名称,请使用这个小改动
ps -o pid= -xa | awk '{print $1}' | xargs -n 1 sudo vmmap | egrep 'swapped_out|Path'
对此命令的另一端进行一些修改,使您能够过滤某些程序名称或命令行路径组件。这里我们仅以“Library/PrivateFrameworks”中的所有进程为例。
ps -o pid,command= -xa | grep 'Library/PrivateFrameworks' | awk '{print $1}' | xargs -n 1 sudo vmmap | grep -A3 'Summary'
答案3
该vmmap PID
命令应该会给你提供一些有关给定进程的有用统计数据。
答案4
打开“/Applications/Utilities”文件夹中的“活动监视器”,其中有一个“虚拟内存”列会告诉您这一点。您可以单击“虚拟内存”标题,按应用程序使用最多或最少进行排序。另外,请务必将“我的进程”更改为“所有进程”,并注意一个应用程序可能有多个进程。例如,第三方应用程序 Little Snitch 由“Little Snitch Network Monitor”和“Little Snitch UIAgent”组成。