程序运行结果如下:

可以看到系统的页面大小为4K,总共请求了655360个页面,即2.5G。每个分页成员占用4个字节,共2621440个字节。 2. 5G内存分为512M块的5个段,成功写入和读取了字符串。
调试过程中,在执行AllocateUserPhysicalPages函数后设置断点,查看任务管理器,可以看到物理内存分配成功后,实际占用物理内存2.5G,从而验证效果敬畏。

通过上面的示例,我们成功地在32位系统中确定了4G内存,并在32位程序中成功使用了2G以上的内存。在PAE和AWE的帮助下,即使在32位系统上,我们也可以在不依赖64位平台的情况下,成功开发出消耗大量内存的应用。
解决方案
默认情况下,32个程序的内存地址空间只有2G。这2G内存除了存储程序数据,还需要存储程序本身。根据经验,一旦程序使用了超过1G的内存,它将不稳定。
方案 1:流程拆分
将程序的内存消耗功能拆分为单独的进程。这种方法目前被用于各种项目的开发中。但有时可能会出现无法拆分的功能(如数据浏览),或者拆分后主进程使用时间长或内存溢出。因此,该方案并不能完全解决内存溢出问题。
方案二:突破2G限制
通过开启/largeaddressaware,突破单进程2G限制(理论上最大4G虚拟地址空间)。
2.2.1 如何操作
具体操作方法:
方法一:在命令行依次执行以下几行命令
cd C:\ Program Files(x8 6) \ Microsoft Visual Studio 1 1. 0 \ VC \ bin
vcvars32.bat
editbin /largeaddressawrexx.exe
方法二:在VS(以VS2012为例)项目属性->Generate Event->Post-Generate Event Command Line中设置如下命令行:
调用"%VS110COMNTOOLS%..\tools\vsvars32.bat"
editbin /largeaddressaware$(TargetPath)
说明:方法一需要在每次编译后执行相关命令;方法二在VS编译后自动完成相关设置操作,使用方便。
2.2.2 测试程序
以下是编写测试程序的示例:
测试程序:通过编写如下程序进行测试,在exe中分配大量内存,并将错误信息输出到日志中
static void Main(string[] args)
{
try
{
int count = 100000000;
List lst = newList(count);
for (int i = 0; i < count;i++)
{
lst.Add(new int[1000000]);
}
}
catch (Exception ex)
{
LogHelper.Error.Append(ex);
}
} 1)未突破2G限制的日志信息如下:
19:33:07:849
System.OutOfMemoryException:抛出“System.OutOfMemoryException”类型的异常。
19:33:07:855
当前专用内部大小:1.69 GB
当前虚拟内存大小:1.94 GB
最大虚拟内存量:1.94 GB
物理内存总大小:4 GB
可用物理内存大小:4 GB
虚拟内存总大小:2 GB
可用虚拟内存大小:62.31 MB
交换空间的总大小:4 GB
可用交换空间大小:4 GB
2)突破4G限制的日志信息如下:
19:33:45:371
System.OutOfMemoryException:抛出“System.OutOfMemoryException”类型的异常。
19:33:45:377
当前专用内部大小:3.59 GB
当前虚拟内存大小:3.9 GB
最大虚拟内存量:3.91 GB
物理内存总大小:4 GB
可用物理内存大小:4 GB
虚拟内存总大小:4 GB
可用虚拟内存大小:105.38 MB
交换空间的总大小:4 GB
可用交换空间大小:4 GB
结论
综上所述,通过方案一和方案二的结合,可以完美解决32位程序的内存溢出问题(当然,如果这个程序占用的内存达到3G以上,还是容易出现到问题,那么就需要从程序本身来优化了)。
[转载]
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-378997-2.html
感觉千玺和里面的小王子形象好贴近
你把发行股票圈的钱回购回去