如何测量应用程序或进程的实际内存使用情况?

这个问题在这里详细介绍。

如何衡量Linux中应用程序或进程的内存使用情况?

从理解Linux上内存使用的博客文章中, ps不是一个准确的工具,可用于此目的。

为什么ps是“错误的”

根据你如何看待它, ps不报告进程的实际内存使用情况。 它真正在做的是如果它是唯一的进程运行,则显示每个进程将占用多少真实内存。 当然,典型的Linux机器在任何时候都有数十个进程在运行,这意味着由ps报告的VSZ和RSS数字几乎肯定是错误的。


使用ps或类似的工具,您只能获得该进程分配的内存页面数量。 这个数字是正确的,但是:

  • 并不反映应用程序使用的实际内存量,而只是为其保留的内存量

  • 如果页面被共享,例如通过多个线程或通过使用动态链接的库,可能会引起误解

  • 如果您真的想知道应用程序实际使用的内存量,则需要在分析器中运行它。 例如, valgrind可以为您提供有关所用内存量的更多信息,更重要的是,可以提供有关程序中可能的内存泄漏的信息。 valgrind的堆分析器工具被称为'massif':

    Massif是一个堆分析器。 它通过定期获取程序堆的快照来执行详细的堆分析。 它会生成一个图表,显示堆的使用情况,包括有关程序的哪些部分负责大部分内存分配的信息。 该图由一个文本或HTML文件进行补充,其中包含更多信息以确定分配最多内存的位置。 地块运行程序比正常慢20倍左右。

    正如valgrind文档中所述,您需要通过valgrind运行该程序:

    valgrind --tool=massif <executable> <arguments>
    

    Massif写入内存使用快照转储(例如massif.out.12345 )。 这些提供(1)内存使用的时间线,(2)为每个快照记录程序内存分配的位置。 分析这些文件的一个很好的图形工具是massif-visualizer。 但是我发现ms_print是valgrind附带的一个简单的基于文本的工具,已经有了很大的帮助。

    要查找内存泄漏,请使用valgrind的(默认) memcheck工具。


    试试pmap命令:

    sudo pmap -x <process pid>
    

    很难说清楚,但这里有两个“接近”的事情可以帮助。

    $ ps aux 
    

    会给你虚拟大小(VSZ)

    您还可以通过转到/proc/$pid/status来从/ proc文件系统获取详细的统计信息

    最重要的是VmSize,它应该接近ps aux给出的值。

    /proc/19420$ cat status
    Name:   firefox
    State:  S (sleeping)
    Tgid:   19420
    Pid:    19420
    PPid:   1
    TracerPid:  0
    Uid:    1000    1000    1000    1000
    Gid:    1000    1000    1000    1000
    FDSize: 256
    Groups: 4 6 20 24 25 29 30 44 46 107 109 115 124 1000 
    VmPeak:   222956 kB
    VmSize:   212520 kB
    VmLck:         0 kB
    VmHWM:    127912 kB
    VmRSS:    118768 kB
    VmData:   170180 kB
    VmStk:       228 kB
    VmExe:        28 kB
    VmLib:     35424 kB
    VmPTE:       184 kB
    Threads:    8
    SigQ:   0/16382
    SigPnd: 0000000000000000
    ShdPnd: 0000000000000000
    SigBlk: 0000000000000000
    SigIgn: 0000000020001000
    SigCgt: 000000018000442f
    CapInh: 0000000000000000
    CapPrm: 0000000000000000
    CapEff: 0000000000000000
    Cpus_allowed:   03
    Mems_allowed:   1
    voluntary_ctxt_switches:    63422
    nonvoluntary_ctxt_switches: 7171
    
    
    链接地址: http://www.djcxy.com/p/14065.html

    上一篇: How to measure actual memory usage of an application or process?

    下一篇: Populate TableView with ObservableMap JavaFX