2012-06-05 36 views
1

我有一個與內存泄漏有關的查詢。內存泄漏對其他進程的影響

一個32位Linux的系統上運行多個活動進程A,B,C,d。所有進程都從堆中分配/釋放內存。現在如果進程A確實泄漏了大量內存,是否會發生這樣的情況:在一段時間之後,進程B無法從堆中找到要分配的內存?

按我理解,每個進程從OS具備2GB的unque VM。但是虛擬機和物理內存之間存在一個映射。

+0

好的。但是,這是個問題嗎? – dAm2K

+0

問題是malloc是否可以在進程B,C,D中失敗? – Bidyut

回答

0

Linux內核默認完成了內存過量使用。 當進程使用malloc()請求一個內存段時,內存不會自動分配。 您可能有4個進程malloc(),每個進程2gb,沒有任何問題。 當進程使用(初始化,bzero,複製)malloc()ed內存時,會出現問題。 你甚至可以爲系統預留malloc更多的內存,沒有任何問題,malloc()甚至不會返回NULL!

+0

dAm2k,我看到B中的malloc失敗,導致程序崩潰,沒有任何內存泄漏。顯然,分配內存的進程正在使用它來存儲數據,並使用memset,memcopy和其他字符串操作。 – Bidyut

+0

嘗試使用dmesg命令,並檢查OOM殺手未殺死您的進程B – dAm2K

2

是的,如果虛擬機(RAM +交換空間)的總數量被進程A耗盡,那麼其他任何進程中的malloc可能因此而失敗。 Linux從其他進程隱藏進程的內存空間,但它不會在您的機器中奇蹟般地創建額外的內存。 (儘管它看起來可能是因爲其overcommit行爲。)

此外,Linux可能會在內存不足時使用其OOM殺手。

+0

謝謝,larsmans,爲您解答。實際上,在我們的測試平臺中,我們正在觀察這種情況。 – Bidyut

+1

只是爲了補充說明,在高內存壓力的情況下,linux可能會觸發臭名昭着的OOM(內存不足)殺手並殺死其他進程。 – dAm2K

+0

dAm2k,請您詳細說明一下。我們有一個在Linux系統上運行的呼叫服務器。還有其他協作流程協助服務器。現在,當我們將服務器置於負載測試狀態時,運行5000個具有20分鐘持續時間的調用後,它會因malloc故障而崩潰。 – Bidyut