1问题描述
目前,该公司的许多程序都需要以32位模式运行,并且某些项目的相关系统容易出现内存溢出问题,并且系统在使用过程中不稳定。通过分析可以得出结论,默认情况下,32个程序的内存地址空间仅为2G。除了存储程序数据外,2G内存还需要存储程序本身。根据经验,一旦程序使用了超过1G的内存,它将不稳定。
2解决方案2. 1解决方案1:流程拆分
将程序的内存消耗功能拆分为单独的进程。该方法当前正在各种项目的开发中使用。但是有时会出现无法拆分功能的问题(例如数据浏览),或者拆分后,长时间使用主进程或发生内存溢出。因此,此解决方案不能完全解决此内存溢出问题。
2. 2方案2:突破2G限制
通过打开/ largeaddress知道,突破了每个进程2G的限制(理论上最大4G虚拟地址空间)。
2. 2. 1如何操作
具体操作方法:
方法1:在命令行上依次执行以下命令行
cd C:\ Program Files(x8 6) \ Microsoft Visual Studio 1 1. 0 \ VC \ bin
vcvars3 2. bat
editbin /largeaddressawrexx.exe
方法2:在VS中设置以下命令行(以VS2012为例)-> Generate Event-> Post-Generate Event命令行:
调用“%VS110COMNTOOLS%.. \ tools \ vsvars3 2. bat”
editbin / largeaddressaware $(TargetPath)
描述:方法一需要在每次编译后执行相关命令;方法二在VS编译后自动完成相关的设置操作,易于使用。
2. 2. 2测试程序
以下是编写测试程序的示例:
测试程序:通过编写以下程序在exe中分配大量内存,并将错误信息输出到日志来进行测试
静态void Main(string [] args)
{
尝试
{
int计数= 100000000;
列表lst = newList(count);
for(int i = 0; i
{
lst.Add(new int [1000000]);
}
}
捕获(异常除外)
{
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
可用的虚拟内存大小:6 2. 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
可用的虚拟内存大小:10 5. 38 MB
交换空间总大小:4 GB
可用交换空间大小:4 GB
2. 3结论
总而言之,通过方案1和方案2的组合,可以完美地解决32位程序的内存溢出问题(当然,如果该程序占用的内存达到3G或更多,这仍然很容易导致问题,那么您需要从程序本身进行优化)。
3参考资料
32位程序在win764位系统上申请4GB内存的方法:
一个进程可以分配的最大内存是多少?是什么决定了这一点? :
c#程序内存分配:
在C#.Net下使用大内存处理x86:
C#打开大地址内存以处理32位计算机的内存不足的问题:
在C#.Net下使用大内存处理x86:
研究C#对象占用的内存大小以及计数和容量之间的差异:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-360142-1.html
既然这样挑衅