Visual Studio 2015存在严重错误,只能在Windows XP中减少可用虚拟内存
问题描述:
我正在开发使用大量内存和线程的视频分析引擎。我们支持从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错误消息。
你知道任何解决方案吗?
答
最近,我找到新的信息。
环境如下。
- 编译:的Visual Studio 2015年
- 编译器选项:v140_xp,使用静态库
测试用例
- 测试案例1:迭代线程创建和删除
这种情况下,物理内存和虚拟内存正在增加。
所以,我认为线程创建和删除存在内存泄漏问题。 - 测试案例2:迭代线程在新建线程中创建和删除迭代内存分配和释放。
这种情况有点不同。
虚拟内存和物理内存也在增加,但虚拟内存的增长速度更快。我认为还有另一个问题,即新线程中的迭代内存分配会导致仅虚拟内存减少!
CRT对由FlsAlloc()提供的清理线程本地状态的回调具有严格的依赖关系。但XP没有这个功能,不能提供替代方案。另一个提醒,XP是真正结束并完成。你需要坚持使用VS2010来构建你的程序的XP版本。 –
我们发现另一个有趣的观点。当只有项目是由静态lib(而不是多线程DLL)构建时,可用的虚拟内存正在减少。所以,我认为vs2015静态lib和dll lib是有区别的。 – JunHo