问题描述:
32位的程序运行在Win2016上,内存增加到1.4G左右就崩溃了。
原因分析:
默认情况下,32位程序虚拟地址空间是4G,其中2G为内核空间,系统使用;2G为用户虚拟地址空间,是用户可申请的最大内存大小。但是一般情况下,由于内存碎片、程序本身的数据等原因,用户可申请的内存大约是1.4~1.8G,如果程序内存达到1.4G以上,程序可能不稳定。
(1)我对1.4~1.8G这个值有些怀疑,于是我写了一个简单的程序测试:
@Override
#include <stdio.h>
#include <list>
#include <windows.h>
int main()
{
std::list<int*> testlist;
while(1)
{
# 每次申请40M内存,直至程序崩溃
int *ptr=new int[10*1024*1024];
testlist.push_back(ptr);
sleep(100);
}
return 0;
}
发现申请内存接近于2G时,程序才崩溃。
(2)至于内存碎片的说法,当时程序其实都还没有频繁业务,只是启动时,加载某些模块内存达到了1.4G便崩溃,但是代码底层模块复杂,内存碎片也难计算出来。
解决方案:
(1)程序中加入代码,定时清理内存;
(2)程序定时重启;
总之是让程序内存在1.4G以下。