1

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

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

有人可以给我一些关于内存使用增长背后的问题的指示吗?我该怎么做才能防止进程由于内存耗尽而导致核心转储?

线程重启有帮助吗?

欢迎任何指点。

4

1 回答 1

4

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

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

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

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

于 2012-07-06T06:07:12.657 回答