【问题标题】:Check how much memory my program uses检查我的程序使用了多少内存
【发布时间】:2013-10-28 23:11:30
【问题描述】:

我有一个 C 代码程序在我的计算机中运行,我需要检查我的程序在运行时使用了多少内存。有什么工具可以用吗?

PS:massif 工具 (valgrind) 在这种情况下有效吗?我已经运行了它,但我不知道如何解释它创建的图形。

PPS:我使用的是 Linux (eO)。

【问题讨论】:

  • 您使用的是什么操作系统?无论如何,“top”可以告诉你一个进程正在使用多少内存......
  • 您使用的是哪个操作系统?

标签: memory


【解决方案1】:

Massif 是一个很棒的工具,可以显示您的程序随着时间的推移使用了多少内存。不过,它也有一些缺点:

  • 所有 Valgrind 工具都很慢;如果你的程序很慢,Massif 会进一步减慢它(我认为是十倍)。
  • 您必须重新启动程序才能使用它,如果您的程序已经在运行,则无法使用 Valgrind(和 Massif)拦截它。
  • 如果您希望 Massif 报告显示代码内存的使用位置,则必须使用“-g”标志编译程序。

如果你用你的程序运行 Massif,你可以运行

ms_print massif.out.1234 > output

您基本上不需要“输出”部分,但我发现用更少(或其他一些文本文件阅读器)来解释结果比滚动终端历史记录更容易。在输出的顶部,您将看到内存消耗随时间变化的图表。在此之下,您将看到来自任意时间间隔的一些快照,您可以从中找到占用内存最多的代码位置。

有一些图形工具可以解释 Massif 结果,但我从来没有觉得我需要它们。研究 ms_print 的报告,您将学会解读其结果。

祝你好运!

【讨论】:

    【解决方案2】:

    如果你使用的是linux,使用一些命令你可以看到你的程序的内存消耗,比如

    top -p Process id 
    pmap pid 
    ps aux
    

    您可以使用 Valgrind 的 memcheck 工具检查简单的内存消耗。 要解释地块图,您应该阅读详细手册。 如果您在 Windows 中,我想您的任务管理器将是一个很好的帮助。浏览此article 以供参考。

    【讨论】:

    • 我使用的是linux,无法使用top,因为程序运行速度非常快。
    【解决方案3】:

    一种方法是捕获对堆函数(例如 malloc、realloc、calloc)的所有调用,然后对总大小求和。如果你的程序中没有这个机制,你仍然可以通过使用 linux 的 LD_PRELOAD 机制在不改变程序的情况下做到这一点。你只需要编译一个小的共享库, 具有以下功能

     void* malloc (size_t size);
     void* calloc (size_t num, size_t size);  
     void* realloc (void* ptr, size_t size);
    

    然后你就可以实现捕捉大小的函数了

     void* malloc (size_t size) {
         totalCount +=  size;
         real_malloc (size_t size)
     }
    

    有关实现的详细信息,您还可以查看以前的答案Overriding malloc with LD_PRELOAD。就我个人而言,我会说只是在您的程序中执行此机制并在内部捕获调用并计算您分配的内存。

    【讨论】:

      猜你喜欢
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      相关资源
      最近更新 更多