使用场景: 自己的32位exe需要占用1.6G内存的使用,在Win7 64位环境中,由于系统内存限制,无法申请到这些内存,发生崩溃!
//
我自己使用的代码模板:
//第一步,进入目录
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build
//命令行执行,进入环境
vcvars32.bat
//命令行执行,设置32位exe操作大内存
editbin /largeaddressaware D:\Qt597\Demo.exe
//命令行执行,查询是否完成: Application can handle large (>2GB) addresses
dumpbin /headers D:\Qt597\Demo.exe
//
一种临时的解决方案如下:
//
参考网文地址如下:
关于c# 在vs2013 x86平台上开辟大内存
32位程序2G内存限制的解决方案
利用Visual Studio为X86程序开启大内存的方法
以下转载的主要内容:
注意
1.内存开启成功的标志:在查看结果中的”FILE HEADER VALUES”段落中,会出现”Application can handle large (>2G) addresses”字样;
2.当程序重新编译后,原有的大内存信息会丢失,所有需要重新开启;
3.在程序中,只需要针对执行文件开启大内存即可,其他的文件非执行文件不需要再开启。
1 问题描述
目前公司的很多程序需要在32位模式下运行,有些项目的相关系统容易遇到内存溢出的问题,系统在使用过程中不太稳定。通过分析得出,默认情况下,32程序的内存地址空间只有2G,这2G内存除了存储程序数据外还需要存储程序本身,根据经验,程序一旦使用超过1G的内存就不太稳定。
将程序中耗内存的功能拆分成单独的进程。此方法在目前的各个项目开发中正在使用。但有时候会出现功能无法拆分(如数据浏览),或拆分后还出现主进程较长时间使用还是出现内存溢出的问题。所以此方案还不能完全解决这个内存溢出的问题。
通过开启/largeaddressaware 的方式突破单进程2个G的限制(理论最大4G 虚拟地址空间)。
具体操作方法:
方法1:在命令行依次执行以下几行命令
cd C:\Program Files(x86)\Microsoft Visual Studio 11.0\VC\bin
vcvars32.bat
editbin /largeaddressaware xx.exe
方法2:在VS (以VS2012为例)项目属性->生成事件->后期生成事件命令行中设置如下命令行:
call"%VS110COMNTOOLS%..\tools\vsvars32.bat"
editbin /largeaddressaware$(TargetPath)
说明:方法一在每次编译后需要执行相关命令;方法二在VS编译后自动完成相关设置操作,使用方便。
以下为测试程序的编写示例:
测试程序:通过在exe中进行编写以下大量分配内存的程序进行测试,将错误信息输出到日志
static void Main(string[] args)
{
try
{
int count = 100000000;
List
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以上的时候还是容易出问题,那就需要从程序本身去优化了)。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
x86平台由于其寻址空间为2^32=4GB,所以在x86平台上的程序最大只能占4GB。vs2013将x86程序限制在2GB的安全范围内,但有时候我们需要开发>2GB的程序,如何突破这个限制呢?
在vs2013的安装目录下有一个程序可以修改这个限制,具体方法如下:
1.以管理员身份运行 VS2013 开发人员命令提示 工具 这个工具可以在vs的安装目录找到 当然 你也可以直接使用cmd
2.打开“editbin.exe” 所在目录 这个文件在vs的安装目录下找到
3.输入:editbin /largeaddressaware $(TargetPath)
如何知道自己成功开启了大内存模式呢?vs安装目录下有一个 dumpbin.exe 工具 这个工具可查看exe文件的很多属性
在上文相同的目录下输入 dumpbin /headers executable_file
如果能看到如下信息 则说明开启成功
如果还没有成功,也可用如下方法:
1.打开项目属性,点开生成事件选项卡
2.在后期生成事件命令行中输入:editbin /largeaddressaware $(TargetPath) (以上路径必须是全路径)
这个修改虽然突破了2GB的限制 但不能突破4GB的限制 这是由于x86的寻址范围只有这么大
如果你的程序超出了4GB的限制,则需要修改为64平台,64平台理论上可支持2^64=16EB 目前64位win7最大支持128GB。如果你实在不想改成64,也可以尝试使用内存映射文件和虚拟内存方法。具体内容请参照
http://www.cnblogs.com/criedshy/archive/2010/06/13/1757826.html
http://www.cnblogs.com/fangyukuan/archive/2010/09/09/1822216.html
以上参考了一下内容,感谢他们的分享!
http://stackoverflow.com/questions/2597790/can-i-set-largeaddressaware-from-within-visual-studio
http://blog.sina.com.cn/s/blog_52deb9d50100ml6s.html
---------------------