2017-10-09 65 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:迭代线程在新建线程中创建和删除迭代内存分配和释放。
    这种情况有点不同。
    虚拟内存和物理内存也在增加,但虚拟内存的增长速度更快。我认为还有另一个问题,即新线程中的迭代内存分配会导致仅虚拟内存减少!
相关问题