【问题标题】:Increased memory usage for a process增加进程的内存使用量
【发布时间】:2012-07-06 06:00:15
【问题描述】:

我有一个在 Solaris 中运行的 C++ 进程,它创建 3 个线程来执行某些任务。 这些线程循环执行,只要进程在运行,它就会一直运行。

但是,我看到进程的内存使用量不断增长,一旦内存使用量超过 4GB,进程核心就会转储。

有人可以就内存使用量增长背后的问题给我一些建议吗? 如何防止进程因内存耗尽而转储内核?

线程重启会有帮助吗?

欢迎指点。

【问题讨论】:

  • 看起来你有内存泄漏。试试 Valgrind。
  • 尝试了净化。看不到任何泄漏
  • 我们需要更多信息。您使用的是原始删除和新的还是 RAII?如果您使用 RAII 并且您有泄漏,那么您有一个可怕的问题要调试,因为您的泄漏可能是由竞争条件引起的,而不是由于缺少删除或删除 []。
  • 我们正在使用原始的新和删除
  • @cppcoder:好吧,那么你刚刚发现了你的问题。停止尝试手动管理内存(或其他资源,FTM),这样做时不可避免地引入的错误将会消失。是的,就是这么简单。

标签: c++ multithreading memory process


【解决方案1】:

不,重新启动线程无济于事。

您的应用程序中似乎存在内存泄漏。

根据我的经验,内存泄漏有两种类型:

  • 应用程序退出时可以看到的真实内存泄漏
  • 'false' 内存泄漏,例如在应用程序的生命周期内增加但在最后被正确清理的大列表

对于第一种类型,有一些工具可以报告应用程序退出时尚未释放的内存。我不了解 Solaris,但 Windows 下有许多工具可以做到这一点。对于 Unix,我认为 Valgrind 可以做到这一点。

对于第二种类型,Windows 下也有一些工具可以对应用程序的内存进行快照。只需每隔几分钟或几小时(取决于您的应用程序)拍摄两个快照,然后让它们通过工具进行比较。 Solaris 上可能有类似的工具。

使用这些工具可能需要您的应用程序占用更多内存,因为该工具需要存储每个内存分配的调用堆栈。因此,它的运行速度也会慢得多。但是,只有在您积极使用此工具时才会看到此效果,因此在实际生产代码中没有效果。

所以,只需要在 Solaris 下寻找这种工具。我很快用谷歌搜索并找到了这个链接:http://prefetch.net/blog/index.php/2006/02/19/finding-memory-leaks-on-solaris-systems/。这可能是一个起点。

编辑: 一些附加信息:您是否在寻找正确的记忆类型?即使你总共只分配了 3GB,由于内存碎片,总的虚拟地址空间仍然可能达到 4GB。不幸的是,您对此无能为力(除了使用另一种内存分配策略)。

【讨论】:

  • 这些线程处理大量内存分配。因此,如果我重新启动线程,如果存在任何泄漏,它不会释放内存吗?我正在使用prstat 命令检查内存
  • 不,只有停止应用才会释放内存。根据我在 Internet 上找到的信息(我自己不了解 Solaris),PRSTAT 的输出显示了虚拟地址大小,它可能比您实际分配的要多(由于碎片)。谷歌“私有字节和虚拟字节之间的差异”以了解差异。谷歌“防止内存碎片”以找到防止碎片的方法(如果这是你的问题)。
  • @cppcoder: 内存是按进程而不是按线程管理的。
猜你喜欢
  • 2017-04-02
  • 2011-07-01
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 2015-11-05
  • 1970-01-01
  • 2016-04-07
相关资源
最近更新 更多