【问题标题】:How to obtain the virtual private memory of a process from the command line under OSX?OSX下如何通过命令行获取进程的虚拟私有内存?
【发布时间】:2012-05-11 14:38:51
【问题描述】:

我想从命令行获取OSX下进程消耗的虚拟私有内存。这是活动监视器在“虚拟内存”列中报告的值。 ps -o vsz 报告进程可用的总地址空间,因此没有用处。

【问题讨论】:

  • 用于解析或查看? top/htop 是一个很棒的查看器。
  • 我需要它来解析。我想记录内存消耗在程序运行的几个阶段是如何发展的,并在各种程序版本和问题参数中进行。因此,我需要能够从脚本中收集数据。
  • 好的,试着学习如何评论stackoverflow,所以这里之前的评论继续:我需要它来解析。我想记录内存消耗在程序运行的几个阶段是如何发展的,并在各种程序版本和问题参数中进行。因此,我需要能够从脚本中收集数据。在更仔细地查看顶部文档后,运行 top -l 1 -s 0 -i 1 -stats vprvt -pid PID 并仅解析输出的最后一行似乎提供了所需的信息,如果仅以整个 MB 为单位(顶部似乎不允许用户选择单位)。
  • 您好@user1389686:如果您点击[回答您自己的问题]并粘贴上面的评论作为答案,那么您将能够接受您自己的答案。这样人们就会更容易找到你的答案。

标签: macos memory command-line


【解决方案1】:

可以通过运行获取单个进程的虚拟私有内存使用情况

top -l 1 -s 0 -i 1 -stats vprvt -pid PID

其中PID 是您感兴趣的进程的进程ID。这会导致大约十几行以结尾的输出

VPRVT
55M+ 

所以通过解析输出的最后一行,至少可以得到内存占用量(MB)。我在 OSX 10.6.8 上对此进行了测试。

【讨论】:

  • 如果我在优胜美地尝试这个,我会得到VPRVT N/A
【解决方案2】:

更新

我意识到(在我被否决后)@user1389686 在 OP 的评论部分给出了一个比我微不足道的第一次尝试更好的答案。以下内容基于 user1389686 自己的回答。我不能把它归功于它——我刚刚清理了一下。

原创,使用 -stats vprvt 编辑

正如 Mahmoud Al-Qudsi 所说,top 可以满足您的需求。如果 PID 8631 是您要检查的进程:

$ top -l 1 -s 0 -stats vprvt -pid 8631
Processes: 84 total, 2 running, 82 sleeping, 378 threads 
2012/07/14 02:42:05
Load Avg: 0.34, 0.15, 0.04 
CPU usage: 15.38% user, 30.76% sys, 53.84% idle 
SharedLibs: 4668K resident, 4220K data, 0B linkedit.
MemRegions: 15160 total, 961M resident, 25M private, 520M shared.
PhysMem: 917M wired, 1207M active, 276M inactive, 2400M used, 5790M free.
VM: 171G vsize, 1039M framework vsize, 1523860(0) pageins, 811163(0) pageouts.
Networks: packets: 431147/140M in, 261381/59M out.
Disks: 487900/8547M read, 2784975/40G written.

VPRVT
8631

以下是我使用一些 Ruby 代码获得该值的方法:

# Return the virtual memory size of the current process
def virtual_private_memory
  s = `top -l 1 -s 0 -stats vprvt -pid #{Process.pid}`.split($/).last
  return nil unless s =~ /\A(\d*)([KMG])/
  $1.to_i * case $2
            when "K" 
              1000
            when "M" 
              1000000
            when "G" 
              1000000000
            else
              raise ArgumentError.new("unrecognized multiplier in #{f}")
            end
end

【讨论】:

    【解决方案3】:

    更新的答案,在优胜美地下工作,来自 user1389686:

    top -l 1 -s 0 -stats mem -pid PID
    

    【讨论】:

      猜你喜欢
      • 2017-12-29
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      相关资源
      最近更新 更多