有什么方法可以判断在Mac OSX(10.2+)上运行的特定应用程序是否已将其部分内存换出(即,换成其中一个/private/var/vm/swapfile*
文件)?多少钱?
赏金(150 rps)
简单的问题。如果我在悬赏期满后不到两天的时间内看到第一个正确答案,则该答案会被接受。如果我还没有,那我将把它奖励给那些告诉我最有趣的新事实的人。如果我从任何答案中都没有学到任何东西,我将把赏金奖励给写得最多的人。
有什么方法可以判断在Mac OSX(10.2+)上运行的特定应用程序是否已将其部分内存换出(即,换成其中一个/private/var/vm/swapfile*
文件)?多少钱?
赏金(150 rps)
简单的问题。如果我在悬赏期满后不到两天的时间内看到第一个正确答案,则该答案会被接受。如果我还没有,那我将把它奖励给那些告诉我最有趣的新事实的人。如果我从任何答案中都没有学到任何东西,我将把赏金奖励给写得最多的人。
Answers:
我一直在大量搜索;-)据我了解,给定进程的虚拟内存被分成页面,这些页面由操作系统处理并呈现给应用程序,就好像它是RAM。
在OS X中,基于Mach内核,这由称为的守护程序处理dynamic_pager
。/private/var/vm
正如您提到的,此过程将生成交换文件。这些交换文件不是基于每个应用程序生成的,而是基于“需要的内存”生成的。交换文件分为4096字节的页面,然后将页面分配给需要虚拟内存的进程(操作系统认为)。因此,您不能将交换文件与给定的应用程序相关联,但是可以看到给定进程正在使用多少页。
您可能想vm_stat
在Termial中尝试该命令。这为您提供了VM使用情况的统计信息(请注意,“页面大小”乘以活动页面数等于交换文件的大小)。这也解释了为什么使用VM可以有多个进程,但是只有几个交换文件。
其他有趣的命令是vmmap [process id]
和pagestuff
。
vmmap [pid]
还是vmmap -pages [pid]
你的问题的第二部分的答案吗?
基于此处发布的想法,我创建了以下几行代码:
sudo vmmap notifyd | grep -A3 'Summary'
显示vmmap输出的Summary部分(3行)。我notifyd
在此示例中使用过,但是您可以将其替换为您知道的任何PID。
该行将尝试列出所有正在运行的进程的所有Summary行。显然有些会失败,因为它们的进程ID已经消失(进程结束),但是总的来说,我发现这是滚动浏览内存信息列表并找出顶部交换器的好方法。
ps -o pid= -xa | awk '{print $1}' | xargs -n 1 sudo vmmap | grep -A3 'Summary'
编辑:一些匿名用户看到最后一个命令行需要改进,因为显然原始变体不再起作用。因此,非常感谢您,无论您是谁,都很抱歉,您的编辑被拒绝了。(第一个命令以前读为“ ps xa”,由于ps标题被抛出,导致vmmap失败)
进一步改进:如果您想立即知道程序的名称,请使用此小更改
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 |
ps -o pid= -xa | awk '{print $1}' | xargs -n 1 -I{} bash -c ‘sudo vmmap {} || true’ | egrep 'swapped_out|^Path:|^Process:'
。它仍然不会在ctrl + c上停止,但也不会在vmmap错误上停止。
在/ Applications / Utilities文件夹中打开“活动监视器”,然后有一个“虚拟内存”列将告诉您这一点。您可以单击“虚拟内存”标题以按应用程序使用最多或最少的顺序进行排序。另外,请确保将“我的进程”更改为“所有进程”,并注意一个应用程序可能具有多个进程。例如,第三方应用程序Little Snitch由“ Little Snitch网络监视器”和“ Little Snitch UIAgent”组成。
正如ridogi所说,打开“活动监视器”。导航到您要检查的过程,然后单击...检查!然后单击内存;这将告诉您给定进程使用了多少交换。
玩得开心!