2017-10-09 66 views
0

我正在開發使用大量內存和線程的視頻分析引擎。我們支持從XP,Win8.1,Win10到Linux的許多操作系統。Visual Studio 2015存在嚴重錯誤,只能在Windows XP中減少可用虛擬內存

大約兩年前更改爲Visual Studio 2015之後,在XP(32位)中出現了很多問題。

最重要的問題是「減少可用虛擬內存」。 感興趣的是物理內存是穩定的(不增加)。 爲了找到原因,我們在幾個月內進行了許多實驗,最後得出結論說有編譯器錯誤。

// project setting : vs2015, 32bit, use static lib, v140_xp 
#include <vector> 
#include <afxwin.h> 

UINT AvailableVMShortageTestThread(LPVOID param) 
{ 
    // Do Nothing! 
    return 0; 
} 

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 
{ 
    int nRetCode = 0; 

    while (1) { 
     // Create test thread 20000 times! 
     for(int i = 0; i < 20000; i++) { 
     CWinThread* thread_ptr = AfxBeginThread (AvailableVMShortageTestThread, 0, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); 
     thread_ptr->ResumeThread(); 
     WaitForSingleObject (thread_ptr->m_hThread, INFINITE); 
     } 
     // Display available virtual memory 
     MEMORYSTATUSEX statex; 
     statex.dwLength = sizeof(statex); 
     GlobalMemoryStatusEx(&statex); 
     printf("ullAvailVirtual:%dMB\n",statex.ullAvailVirtual/(1024 * 1024)); 
    } 

    return nRetCode; 
} 

下面的鏈接圖片是vs2010 vs vs2015之間的測試結果圖片。 memory test vs2010 vs vs2015. 在Visual Studio 2015中,重複創建線程會導致Windows XP中的可用虛擬內存減少。 減少可用虛擬內存會產生另一個大問題。 該錯誤無法處理異常並彈出Dr. Watson錯誤消息。

你知道任何解決方案嗎?

+1

CRT對由FlsAlloc()提供的清理線程本地狀態的回調具有嚴格的依賴關係。但XP沒有這個功能,不能提供替代方案。另一個提醒,XP是真正結束並完成。你需要堅持使用VS2010來構建你的程序的XP版本。 –

+0

我們發現另一個有趣的觀點。當只有項目是由靜態lib(而不是多線程DLL)構建時,可用的虛擬內存正在減少。所以,我認爲vs2015靜態lib和dll lib是有區別的。 – JunHo

回答

0

最近,我找到新的信息。
環境如下。

  1. 編譯:的Visual Studio 2015年
  2. 編譯器選項:v140_xp,使用靜態庫

測試用例

  1. 測試案例1:迭代線程創建和刪除
    這種情況下,物理內存和虛擬內存正在增加。
    所以,我認爲線程創建和刪除存在內存泄漏問題。
  2. 測試案例2:迭代線程在新建線程中創建和刪除迭代內存分配和釋放。
    這種情況有點不同。
    虛擬內存和物理內存也在增加,但虛擬內存的增長速度更快。我認爲還有另一個問題,即新線程中的迭代內存分配會導致僅虛擬內存減少!
相關問題