c++ - 增加进程的内存使用

标签 c++ multithreading memory process

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

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

谁能给我一些关于内存使用增长背后的问题的建议? 如何防止进程因为内存耗尽而进行核心转储?

线程重启会有帮助吗?

欢迎任何指点。

最佳答案

不,重新启动线程没有帮助。

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

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

  • 应用程序退出时您可以看到的真实内存泄漏
  • '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。不幸的是,您对此无能为力(除了使用另一种内存分配策略)。

关于c++ - 增加进程的内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11356652/

相关文章:

mysql - 了解 InnoDB 锁定和事务模型

linux - Perl 内存不足但有足够的可用内存

c++ - 如何使用 std::string 的值作为 Flex 规则的模式?

c++ - 具有依赖于时钟时间的私有(private)成员的方法的 GTest

python - 使用 Python 和 pymongo 的多线程

swift - 释放 UnsafeMutableBufferPointer<UInt8> 值

assembly - 想要在程序集中以空终止字符串,但出现段错误

c++ - 在 C++ 中存储货币值的最佳方式

c++ - 递归函数中的段错误

c - 当其他线程不执行时运行多个线程?