32位程序在Windows上的内存问题

本文探讨了一款32位程序在Windows 2016上运行时,内存达到约1.4G后崩溃的问题。通过编写测试程序验证,发现在接近2G时程序才会崩溃,而非普遍认为的1.4~1.8G。作者怀疑内存碎片可能是原因,但由于代码复杂性,难以精确计算。提出的解决方案包括定期清理内存和程序重启,以确保内存始终低于1.4G。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

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以下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值