2012-07-06 41 views
1

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

但是,我发现进程的内存使用量持续增长,一旦内存使用超过4GB,进程内核就会转储。

有人可以给我一些关于什么可能是内存使用增长背后的问题的指针? 我能做些什么来防止由于内存耗尽而导致核心转储的过程?

线程重启会有帮助吗?

欢迎任何指针。

+1

看起来你有内存泄漏。尝试Valgrind。 – chris 2012-07-06 06:02:55

+0

尝试Purify。看不到任何泄漏 – cppcoder 2012-07-06 06:03:59

+0

我们需要更多的信息。你使用原始删除和新的或RAII?如果你使用RAII,并且你有泄漏,那么你有一个可怕的问题来调试,因为你的泄漏可能是由竞态条件引起的,而不是缺少删除或删除[]。 – NoSenseEtAl 2012-07-06 07:07:29

回答

4

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

看起来好像你的应用程序中有内存泄漏。

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

  • 真正的内存泄漏,你可以看到,当应用程序退出
  • “假”内存泄漏,就像一个大名单的一生中增加您的应用程序,但它是在最后正确清理

对于第一种类型,有工具可以报告你的应用程序退出时尚未释放的内存。我不知道Solaris,但在Windows下有许多工具可以实现这一点。对于Unix,我认为Valgrind会这样做。

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

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

所以,只需在Solaris下查找这种工具即可。我赶紧Google搜索,发现这个链接:http://prefetch.net/blog/index.php/2006/02/19/finding-memory-leaks-on-solaris-systems/。这可能是一个起点。

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

+0

这些线程处理大量的内存分配。所以,如果我重新启动线程,不会释放内存,如果有泄漏存在?我正在使用'prstat'命令检查内存 – cppcoder 2012-07-06 06:18:15

+2

不,只有在停止应用程序时才会释放内存。根据我在Internet上可以找到的信息(我自己不知道Solaris),PRSTAT的输出显示虚拟地址大小,它可能比您实际分配的数量多(由于分段)。谷歌的“私人字节和虚拟字节之间的差异”了解差异。谷歌的“防止内存碎片”找到方法来防止碎片(如果这是你的问题)。 – Patrick 2012-07-06 06:27:18

+0

@cppcoder:内存是由process_处理的,而不是_per线程。 – sbi 2012-07-06 09:55:44