2012-09-24 55 views
1

該程序寫在C++X86_64 Linux 2.6.32.12,有兩種情況,一種情況會爲每個注入的文件生成一個文件,併發送出去通過UDP(Version A);另一種情況不會生成文件,直接通過UDP(Version B)發送注入的文件。爲什麼物理內存不斷增加並且虛擬內存大小會在linux上長時間增加一點點

=============== VersionA統計圖形=========================== http://i.stack.imgur.com/8bxI5.png http://i.stack.imgur.com/8bxI5.png

================ VersionB Statictic圖形======================== === http://i.stack.imgur.com/wEnKc.png http://i.stack.imgur.com/wEnKc.png

我使用valgrind驗證這兩種情況下,該報告是一樣的,看不到任何內存泄漏。 這是由linux內核內存映射引起的嗎?測試機器有64G內存。 這是memory leak

更新信息:

Version A,我們使用UNIX socket到原來的文件內容發送到另一個應用程序,然後接收處理結果生成所需的文件。如圖所示,物理內存將增加。我已經嘗試了另一種情況,不要通過Unix套接字發送文件,使用system函數,調用另一個應用程序生成所需的文件,這表明內存不會增加。看來新生成的文件不是問題,它是由Unix套接字引起的。我們使用套接字池,我使用lsof,沒有額外的套接字打開。 Unix socket會佔用內存嗎?

回答

2

我猜測版本A正在爲文件內容分配內存,而內存管理器在釋放內存時並未返回系統(因爲它正確地知道內存將被重用)。

我不用擔心,如果內存有壓力,內核將重新使用內存。

+0

在版本A中,我們使用UNIX套接字將原始文件內容發送到另一個應用程序,然後接收處理結果生成所需的文件。如圖所示,物理內存將增加。我已經嘗試了另一種情況,不要通過Unix套接字發送文件,使用系統函數,調用另一個應用程序生成所需的文件,這表明內存不會增加。看來新生成的文件不是問題,它是由Unix套接字引起的。我們使用套接字池,並使用lsof,沒有額外的套接字打開。 Unix套接字是否會佔用內存? – robin

0

可能您正在獲取內存碎片,這會停止將內存塊返回到操作系統。

+0

首先,我也認爲這是內存碎片的原因,我也使用tcmalloc和jemalloc,結果是一樣的,我不知道tcmalloc或jemalloc好,他們似乎將內存分成小塊,大塊。 – robin

相關問題