我有一臺運行在Windows 2003企業中的C++實現的服務器,具有25GB RAM。爲什麼_beginthread返回錯誤ENOMEM
在壓力測試期間,我看到它試圖通過調用_beginthread創建一個新線程時,我得到了ENOMEM,意思是「內存不足」。
但是我不明白爲什麼它內存不足,perfmon數據顯示,那個時候,進程已經使用了1.2GB的虛擬機和類似的物理內存,只有250個線程。
任何人都可以幫助我分析或解釋爲什麼我仍然有這個錯誤?
我有一臺運行在Windows 2003企業中的C++實現的服務器,具有25GB RAM。爲什麼_beginthread返回錯誤ENOMEM
在壓力測試期間,我看到它試圖通過調用_beginthread創建一個新線程時,我得到了ENOMEM,意思是「內存不足」。
但是我不明白爲什麼它內存不足,perfmon數據顯示,那個時候,進程已經使用了1.2GB的虛擬機和類似的物理內存,只有250個線程。
任何人都可以幫助我分析或解釋爲什麼我仍然有這個錯誤?
它結束了,因爲我們的應用程序中有內存泄漏。
創建少於2048個線程後,典型的32位應用程序將耗盡(虛擬)內存。默認情況下,每個線程保留1MB的連續虛擬地址空間,以便2048個線程需要2GB的虛擬內存。這是32位進程在用戶模式下可能消耗的最大值。
P.S.有一個選項(至少在Windows上)可以配置操作系統在用戶模式下保留最多3GB的虛擬地址空間。
但我只使用250個線程,而我的虛擬機使用率爲1.2G。根據你的回答,看起來我不應該看到錯誤,是嗎? – performanceuser
雖然這在技術上是正確的(默認1MB堆棧),但它與此問題無關;你誤解了。這個問題說**二百五十**線程,而不是**二千五百**。 –
線程通常需要1 MB的未分片的地址空間。如果您的壓力測試將內存碎片化到沒有1 MB可用的地步,您將無法創建任何新線程。在最壞的情況下,這可以通過2000個分配一個字節來實現。
謝謝。這是一個好點。 – performanceuser
這是一個32位應用程序嗎?如果是這樣的話,它限制在2GB(物理+虛擬)內存,你說「使用1.2GB虛擬機和類似的物理內存」),這將超過2GB。 –
它有多少個線程?!你有一個你製作的線程數的上限。你使用線程池嗎?! –
@KenWhite爲什麼你說限制爲2GB(物理+虛擬)?我認爲2GB是虛擬限制。對於物理內存,我啓用了PAE,所以它比4G多。 – performanceuser