我在Solaris中运行了一个C ++进程,它创建了3个线程来完成一些任务。 这些线程在循环中执行,只要进程正在运行就会运行。
但是,我发现进程的内存使用量不断增长,一旦内存使用量超过4GB,进程核心就会转储。
有人可以给我一些关于内存使用量增长背后问题的一些指示吗? 由于内存耗尽,我该怎么做才能防止核心转储过程?
线程重启会有帮助吗?
欢迎任何指示。
答案 0 :(得分:4)
不,重新启动线程无济于事。
您的应用程序中似乎有内存泄漏。
根据我的经验,有两种类型的内存泄漏:
对于第一种类型,有一些工具可以报告应用程序退出时尚未释放的内存。我不知道Solaris,但Windows下有很多工具可以做到这一点。对于Unix,我认为Valgrind会这样做。
对于第二种类型,Windows下还有一些工具可以拍摄应用程序内存的快照。只需花几分钟或几小时的间隔(取决于您的应用程序)拍摄两张快照,然后通过工具进行比较。在Solaris上可能有这样的类似工具。
使用这些工具可能需要您的应用程序占用更多内存,因为该工具需要存储每个内存分配的调用堆栈。因此,它也会运行得慢得多。但是,当您正在使用此工具时,您将只看到此效果,因此在现实生产代码中没有任何效果。
所以,只需在Solaris下寻找这种工具。我快速搜索了它,发现了这个链接:http://prefetch.net/blog/index.php/2006/02/19/finding-memory-leaks-on-solaris-systems/。这可能是一个起点。
编辑:一些其他信息:您正在寻找合适的内存吗?即使您总共只分配了3GB,由于内存碎片,总虚拟地址空间仍可能达到4GB。不幸的是,你无能为力(除了使用另一种内存分配策略)。