2013-10-30 31 views
1

在Solaris 10上,我有一个多线程进程,出现了一个奇怪的行为。它管理复杂的C++结构(RWTVal或RWPtr)。这些结构是根据存储在数据库中的数据构建的(使用Pro * C)。该过程每小时都会在数据库中查找新的信息,在内存上构建新的结构并释放旧数据。但是,每次重复此过程时,进程内存使用量都会增加几MB(12/16MB)。进程的内存使用量从100M开始直到接近1,4G。就这一点而言,这个过程似乎存在内存泄漏。但奇怪的是,在这之后,这个过程停止了,继续成长。当我尝试查找内存泄漏时(使用Purify工具),该过程不会长大,也不会显示明显的泄漏。有没有人找到类似的行为,或可以解释可能发生的事情?Solaris进程内存使用量增加但并非永久

+1

@JoachimPileborg你应该做出答案。听起来像是对我的正确答案。 – EricSchaefer

回答

1

很可能在释放内存时,操作系统实际上并没有“扔掉”旧的内存页,因为如果操作系统没有,应用程序分配更多的内存会更快分配更多页面。但只能达到当然的极限。

+0

不只是“可能”。这是记录的行为。 Solaris上'free()'的手册页显示_“...被执行,该空间可供应用程序进一步分配,但不会返回到系统。”_请参见http://docs.oracle.com /cd/E23824_01/html/821-1465/free-3c.html –

+0

是的,这是一个问题:新的malloc操作必须重用先前释放的内存,但似乎没有发生。在正常执行过程中,由于此重用内存,进程在处理时可能会增长一点点。在我的例子中,为什么没有发生?经过新的测试后,我发现稳定点(1.4G)取决于我在每次操作中必须分配的内存量。如果我尝试在相同的操作中分配更大的结构,则该进程会达到4G的最大可寻址能力(这是一个32位应用程序)。非常感谢。 – jjavibv