2013-10-30 34 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